论坛首页 Java企业应用论坛

Java中的垃圾回收与对象生命周期

浏览 18257 次
精华帖 (5) :: 良好帖 (2) :: 新手帖 (5) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-06-22  
Thinking in Java是本不错的书籍,但它仍然是一个适合入门的作用,很多概念都提到了,但所讲的有的地方并不太深入。
像对象的生命周期管理,如果只是入门理解,Thinking in Java讲的差不多,但更深入的理解,
就要细分这些概念了:jvm的一个核心作用就是管理类型的生命周期,对象的生命周期是被包含在类型的生命周期范围之内的;
生命周期中的行为(不同时间点的不同行为了)与结构(类型信息数据,对象信息数据的存储)问题 ;垃圾回收的目的,不同的实现算法,不同实现算法之间的利弊.
在这些的讲述上,Thinking in Java并没有过多的讲解,当然如果要把这些都进行稍详细的讲解,书籍的页码至少会增加100页吧,
但Thinking in Java的简述意义是很大的,它至少告诉我们有这些概念,而且这些对于jvm来说是至关重要的。
0 请登录后投票
   发表时间:2010-06-22  
这个得留下个印,交流肯定会继续。

静观
0 请登录后投票
   发表时间:2010-06-22  
wangzaixiang 写道
mercyblitz 写道

  <3>重用是肯定的,但是对象空间能不能马上重用,很难说,G1的算法和CMS等算法不同。G1是等大小区域,相对来说比较容易。CMS,我没有记错的话,是采用的碎片空间移动。




CMS缺省是不做碎片处理的。G1则是。



Thanks,果然我记错了。
0 请登录后投票
   发表时间:2010-06-23   最后修改:2010-06-23
mercyblitz 写道

4.我的理解是:
  <1> 比如方法中的局部对象,并不需要JVM标记不可达,在方法执行完之后,马上就被回收。这就是为什么不需要在局部对象使用后,显示地设置为null.



对象引用的作用域与对象的生命周期搞混了吧。

0 请登录后投票
   发表时间:2010-06-23  
不要写成:
1。 
       for (int i = 0; i < 10000; i++) { 
             Object obj = new Object(); 
             System.out.println(obj); 
       } 
 
       要写成:
2。 
       Object obj = null; 
       for (int i = 0; i < 10000; i++) { 
             obj = new Object(); 
             System.out.println(obj); 
       }
-------------------
可不可以理解为 方法2 只做了一次栈空间分配 而方法1 却做了10000次栈空间的分配
虽然两个在数量上都只 用了1个栈空间,这上边应该也有性能损耗吧。
0 请登录后投票
   发表时间:2010-06-23  
H_eaven 写道
mercyblitz 写道

4.我的理解是:
  <1> 比如方法中的局部对象,并不需要JVM标记不可达,在方法执行完之后,马上就被回收。这就是为什么不需要在局部对象使用后,显示地设置为null.



对象引用的作用域与对象的生命周期搞混了吧。


这里作用域没有关系。
0 请登录后投票
   发表时间:2010-06-23  
gong_leon 写道
不要写成:
1。 
       for (int i = 0; i < 10000; i++) { 
             Object obj = new Object(); 
             System.out.println(obj); 
       } 
 
       要写成:
2。 
       Object obj = null; 
       for (int i = 0; i < 10000; i++) { 
             obj = new Object(); 
             System.out.println(obj); 
       }
-------------------
可不可以理解为 方法2 只做了一次栈空间分配 而方法1 却做了10000次栈空间的分配
虽然两个在数量上都只 用了1个栈空间,这上边应该也有性能损耗吧。



字节码不会复制N次,它也有循环语句的。
0 请登录后投票
   发表时间:2010-06-24   最后修改:2010-06-24
gong_leon 写道
不要写成:
1。 
       for (int i = 0; i < 10000; i++) { 
             Object obj = new Object(); 
             System.out.println(obj); 
       } 
 
       要写成:
2。 
       Object obj = null; 
       for (int i = 0; i < 10000; i++) { 
             obj = new Object(); 
             System.out.println(obj); 
       }
-------------------
可不可以理解为 方法2 只做了一次栈空间分配 而方法1 却做了10000次栈空间的分配
虽然两个在数量上都只 用了1个栈空间,这上边应该也有性能损耗吧。


答案是:在性能上二者完全一致,不存在任何耗损。
为什么呢?我是很难解释清楚,给你个建议,去看看javap -c,也就是字节码,看懂了你就完全明白了。这就是所谓的汇编思维。

我的解释是:在函数执行时,在循环中,并不需要每次分配一个变量的,变量的空间在栈上,随时可用,没有“分配”这个操作,因此,没有开销,并不是“开销很小”,而是完全没有,这与new不同,每次new都是有具体开销的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics