• 云时代架构阅读笔记一——Java性能优化(一)


    Java语言学习了这么长时间之后,自己对于Java编程的一些细节还是稍微有点总结,正好根据云时代架构中《Java高级开发必会的50个性能优化的细节(珍藏版)》来叙述一些我和里面的点比较相符且有点感悟的地方。

    1)尽量在合适的场合使用单例

      单例模式我们并不陌生,软件设计的设计模式中单例模式相对来说是比较重要的一个。单例模式的优点非常明显,就是避免多次创建同一个对象,这样可以减轻系统加载的负担,减少内存的占用,使系统的总体效率有所提高。这里我也举一个单例模式的例子:

    public class Singleton {
        
        private static Singleton singleton;
    
        private Singleton(){}
    
        public static Singleton getInstance() {
            if (singleton == null) {
                singleton = new Singleton()
            }
            return singleton;
        }
    }

    可以看到单例模式的特点:1)有一个静态成员变量,变量的类型为本类;2)构造方法为私有,这是为了防止在外面调用构造函数。

    通过这段代码:单例模式在当前成员变量已经创建了之后即已经存在了之后就不会再次创建而是直接返回这一个对象,这样可以防止对象的重复创建。

    但是这种方法也有局限:这种写法是懒汉式的一种,但它只适用于单线程下的使用,当使用多线程的时候,如果有两个同时访问这段代码,第一个判断为空后就会创建一个对象,但此时第二个也已经执行完毕,也判断其为空,同样也会创建一个对象,这就使单例模式的作用没有发挥出来,有兴趣的可以多去研究研究。

    2)尽量避免过多过常的创建Java对象。

    这句话看着确实有道理,但是很少有人注意,感觉这句话没有很适合的场景,自己从来没有过多的创建过Java对象,这里我写一段大家非常之熟悉的代码:

    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    ResultSet rs = preparedStatement.executeQuery(); List<User> users = new ArrayList<User>(); while(rs.next()) { User user = new User(); user.setUserName(rs.getString("username")); user.setPassword(rs.getString("password")); users.add(user); } return users;

    这端代码相信经历过JavaWeb开发的人员们并不陌生甚至来说是非常熟悉,这段代码实现的就是从数据库查询出所有的用户并返回,当然这段代码本身是没有错误的,但是我现在稍微进行改进一下:

    在while循环上面加一句话:User user = null; 然后将红色标注的部分改成user = new User();

    这两个一对比就会发现,第一种虽然可以实现,但是没执行一次while循环就会创建一个User类的对象,假如数据库中有100000条数据,执行这一次查询之后就会创建100000个对象,这对系统造成的压力可想而知,虽然以现在的电脑配置等的处理这么多问题不是事。但是这种优化我们还是应该知道的;然后我们再来看第二写法,先是声明了一个对象,但并没有赋值;然后每执行一次while循环就只会给之前创建的这个对象赋值然后返回,也就是说,通过100000次循环之后,我们只是创建了一个对象,这和之前相比起来改进还是挺大的吧。

    3)尽量在finally块中释放资源

    异常的处理一直是被开发人员关注但却怎么也达不到完美的技术。可以这样说,如果一个程序员开发的系统将所有的异常都处理的非常好,那他绝对是超乎常人的存在。在日常开发中,我们也会遇到异常的问题,常见的有空指针、下标越界等,所以,异常的处理就显得特别重要,要不然将来让用户看到HTTP 500的时候用户会怎么想。而在异常处理中,finally一直没有被我们重视,一般我们在使用异常的时候仅仅使用try...catch并没有考虑到finally,但其实finally的存在使得我们在考虑什么时候关闭资源的问题不复存在,我不管你再try还是catch里面执行什么操作,在我finally这里就执行最后的收尾就可以了。日常使用的比如文件的关闭、对象的释放、使用最多的还有数据库对象的关闭等在finally中写上不仅使得程序的结构更加清晰,而且不会出现这样那样的问题。

  • 相关阅读:
    刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解【转】
    ElasticSearch 内存那点事【转】
    Zookeeper之Zookeeper的Client的分析【转】
    Zookeeper之Zookeeper底层客户端架构实现原理(转载)
    elasticsearch 性能调优
    ElasticSearch性能优化策略【转】
    elasticsearch中 refresh 和flush区别【转】
    我理解的朴素贝叶斯模型【转】
    (转)Intellij IDEA 快捷键整理
    使用Mongo dump 将数据导入到hive
  • 原文地址:https://www.cnblogs.com/guo-xu/p/11019267.html
Copyright © 2020-2023  润新知