专栏首页Java技术栈90 % Java 程序员被误导的一个性能优化策略

90 % Java 程序员被误导的一个性能优化策略

Java技术栈,每天给你诚意满满的干货

我们经常看到一些 Java 性能优化的书或者理念,说不要在循环内定义变量,这样会占用过多的内存影响性能,而要在循环外面定义。接触 Java 这么久以来,相信很多 Java 程序员都被这种代码性能优化策略所误导。

看下面两个示例,示例1在循环外定义变量,示例2是在循环内定义变量。

/**
 * 循环外定义变量
 */
private static void outer() {
    Javastack javastack = null;
    for (int i = 0; i < 10; i++) {
        javastack = new Javastack();
    }
}

/**
 * 循环内定义变量
 */
private static void inner() {
    for (int i = 0; i < 10; i++) {
        Javastack javastack = new Javastack();
    }
}

先来分析这两个示例吧。

循环外定义变量

循环外定义变量,变量循环内每次引用指向不同的对象实例,每次循环变更对象实例时,上一次被指向的对象就会被销毁,直到最后一个循环。这样,循环结束后,这个变量还存在,并指向循环内最后一个对象实例,其他对象都销毁了。

这样,本应该是循环体内的生命周期变量被扩散到了循环外,如果循环外依旧用这个变量,会导致后面的业务发生不可预知的后果。这种问题在笔者工作当中经常会遇到,看下面的例子。

/**
 * 循环外定义变量
 */
private static void outer() {
    Javastack javastack1 = null;
    for (int i = 0; i < 10; i++) {
        javastack1 = new Javastack();
    }

   Javastack javastack2 = userDao.getUser(10);

}

上面定义了一个 javastack2 ,如果此时在后续代码或者传递到别的方法时写错了,用了 javastack1,那这时不就有问题了吗?这只是一方面,还有如果用同一变量名,当这一变量被重用时发生异常,本来发生异常应该是 null 值的,结果得到了是之前循环体内的值。

循环内定义变量

循环内定义变量,和循环外略有不同的是,每次都会创建新的局部变量指向新的对象实例,每个变量和对象的生命周期仅限于在循环体之内,而且每次循环结束该局部变量和对象实例都会随着循环体的结束而销毁,所以不存在占用更多的内存这一说法。

总结

两种用法都会创建相同数量的对象实例,只不过循环内会反复创建相同数量的局部变量,栈内存垃圾回收频率也会更高,但对于堆垃圾回收带来的性能影响和变量生命周期带来的业务影响来说,栈内存这点性能影响可以忽略不计。

所以,建议使用循环内定义变量,这种把变量的生命周期限制在循环体范围内,也不会出现业务上重用变量而导致严重的问题。

本文分享自微信公众号 - Java技术栈(javastack)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 干货:Java正确获取客户端真实IP方法整理

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid...

    Java技术栈
  • 轻松几步搞定SSH连接Git配置

    如果使用ssh的方式管理,需要配置ssh key. 1、打开git bash命令窗口 2、生成ssh key ssh-keygen -t rsa -b 4096...

    Java技术栈
  • 你必须掌握的 21 个 Java 核心技术!

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Java。

    Java技术栈
  • 学界 | 百度研究院:都知道数据越多越好,现在我们还能预测增加了数据以后具体有多好

    AI 科技评论按:在深度学习界,「数据越多,模型表现就越好」是大家公认的规律,不过很多时候我们都不太清楚具体的「增加多少数据,能带来多大提升」。前几个月谷歌的一...

    AI科技评论
  • 记一次网易前端实习面试

    很幸运地能收到网易的面试通知,就毫不犹豫翘了课去面试了hhhh~三点的面试,因为从来没去过那个中关村西北旺区,吃完饭早早就去了,想象中那里应该是繁华的地方hhh...

    疯狂的技术宅
  • 超详细讲解Sqoop2应用与实践

    摘要:超详细讲解Sqoop2应用与实践,从hdfs上的数据导入到postgreSQL中,再从postgreSQL数据库导入到hdfs上。详细讲解创建link和创...

    王小雷
  • Docker开启远程安全访问

    找到 Service 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375

    niceyoo
  • Python第六课:格式化字符串

    当我们想打印一段话,而这段话中有一些数字和字符串变量已经被我们事先定义过,这时候如何很好的插入这些变量呢?答案便是 格式化字符串 。在例一中我们用了两次格式化字...

    HuangWeiAI
  • 【资讯】互联网创业者如何才能掘金大数据?

    大数据能称之为一个时代,可见维克托•迈尔•舍恩伯格对大数据的褒奖。当然,更多的人希望通过大数据创建新的产业群,将之应用到医疗、教育、科技等多个领域。...

    小莹莹
  • SpringBoot无法访问webapp目录下的文件

      在pom中添加此段 完美解决,代码的作用是让src/main/webapp在编译的时候在resoureces路径下也生成webapp的文件

    Arebirth

扫码关注云+社区

领取腾讯云代金券