java代码优化问题,求大神指导

rock912 发布于 2014/12/12 13:54
阅读 891
收藏 1
下面有两个循环,关于执行效率和内存释放问题
1. 
for(int i=0;i<10;i++) {
  List listO = new ArrayList<String>();
  //todo
}


2.
List listT=null;
for(int i=0;i<10;i++) {
      listT = new ArrayList<String>();
      //todo
      listT=null;
}
1中,在每次循环中,在循环体内new 了一个ArrayList, listO是循环内的局部变量,对象listO指向一个ArrayList,作为引用,每次循环结束后, listO生命周期结束,listO所指向的ArrayList实例没有被引用了,等待虚拟机回收。
2中,listT在循环体外声明,每次循环 new 一个对象,指向listT,当每次循环结束前,人为置null,每次产生的ArrayList实例没有被引用了, 等待虚拟机回收
个人认为,两段代码从内存开销和性能方面差不多,但有人认为2的性能内存开销比1好,等待大神解答
加载中
2
狮城蜗牛
狮城蜗牛

没啥区别,主要性能损耗在对像的创建。

listT=null这句话是多余的。写不写这句也是gc心情好的时候回收。还多执行一个赋值操作。

1
有明丶
有明丶

认为2好是什么心态。

首先,两者不论怎么比较,内存开销是一致的,而且可以说,2中还会留下一个空引用,内存还会稍微大一些。

而且!!最重要的,作为一个Java程序员(甚至是其他语言的),一定要尽力缩小变量作用域,这样才能更好的优化内存,而 2 中在for之外定义完全无用的变量,是没有意义的无用功。

0
mfly
mfly
你跑一下程序,看看运行需要的内存,运行时间,就可以啦。
rock912
rock912
回复 @mfly : 我循环一亿,运行时间跟内存消耗差不多
mfly
mfly
@rock912 循环大点,一万,十万的,就看出区别了。
rock912
rock912
跑了,基本一样
0
白小衣
白小衣

应该是,2的性能更好,但内存开销没什么区别

还有2里面listT=null; 我觉得是多余的

0
lokeny
lokeny
我们先来理解下  对象与引用的概念。可以等同理解为指针和内存的概念。。。1中,你建立了10个引用对象listO,而2中你只建立了一个引用对象listT。这就是区别。。。至于ArrayList对象的内存开销是一样的。。。现在来说java虚拟机回收,不同的虚拟机回收是有区别的;但是理论上回收没有引用的对象,比回收有引用的对象要来的快和方便的多;有引用了,你需要找到引用并且继续追踪引用的引用是否也不用了。这个过程对jvm来说是比较大的开销(当然,不通的虚拟机是有区别的;关于虚拟机回收消耗的描述,你做参考就行)。
0
cyper
cyper
性能无区别,第2种太别扭(可维护性差) ,最烦看到别人这么写。
第1种是我喜欢的(有一个原则是变量的范围越窄越好)。
0
ArrayListt
ArrayListt

因为作用域的关系,所以感觉几乎没什么性能差别

但是一般情况下,list用完了,记得clear一下内容

0
Sub
Sub

从变量分配表看, 2 者完全相同。
所以,方法 1  的性能稍微好一点,因为方法 2 多了个 set null 的语句。

0
开源中国首席经纪人
开源中国首席经纪人
List list= new ArrayList(); 
for(int i=0;i<10;i++) {   
   list.clear();  
   //todo 
} 
list=null;//据说可以加快回收,没测试过



rock912
rock912
测试了,没作用
0
一只小桃子
一只小桃子
这种问题,使用javap -verbose查看生成的java字节码,就能看到操作到底有什么区别。至于垃圾回收,这上面两个应该是一样的,无非是栈操作有点差异,几乎对性能没影响
rock912
rock912
嗯,试了
返回顶部
顶部