锁定老帖子 主题:Java中的垃圾回收与对象生命周期
精华帖 (5) :: 良好帖 (2) :: 新手帖 (5) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-22
Thinking in Java是本不错的书籍,但它仍然是一个适合入门的作用,很多概念都提到了,但所讲的有的地方并不太深入。
像对象的生命周期管理,如果只是入门理解,Thinking in Java讲的差不多,但更深入的理解, 就要细分这些概念了:jvm的一个核心作用就是管理类型的生命周期,对象的生命周期是被包含在类型的生命周期范围之内的; 生命周期中的行为(不同时间点的不同行为了)与结构(类型信息数据,对象信息数据的存储)问题 ;垃圾回收的目的,不同的实现算法,不同实现算法之间的利弊. 在这些的讲述上,Thinking in Java并没有过多的讲解,当然如果要把这些都进行稍详细的讲解,书籍的页码至少会增加100页吧, 但Thinking in Java的简述意义是很大的,它至少告诉我们有这些概念,而且这些对于jvm来说是至关重要的。 |
|
返回顶楼 | |
发表时间:2010-06-22
这个得留下个印,交流肯定会继续。
静观 |
|
返回顶楼 | |
发表时间:2010-06-22
wangzaixiang 写道 mercyblitz 写道 <3>重用是肯定的,但是对象空间能不能马上重用,很难说,G1的算法和CMS等算法不同。G1是等大小区域,相对来说比较容易。CMS,我没有记错的话,是采用的碎片空间移动。 CMS缺省是不做碎片处理的。G1则是。 Thanks,果然我记错了。 |
|
返回顶楼 | |
发表时间:2010-06-23
最后修改:2010-06-23
mercyblitz 写道
4.我的理解是: <1> 比如方法中的局部对象,并不需要JVM标记不可达,在方法执行完之后,马上就被回收。这就是为什么不需要在局部对象使用后,显示地设置为null. 对象引用的作用域与对象的生命周期搞混了吧。 |
|
返回顶楼 | |
发表时间: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个栈空间,这上边应该也有性能损耗吧。 |
|
返回顶楼 | |
发表时间:2010-06-23
H_eaven 写道 mercyblitz 写道
4.我的理解是: <1> 比如方法中的局部对象,并不需要JVM标记不可达,在方法执行完之后,马上就被回收。这就是为什么不需要在局部对象使用后,显示地设置为null. 对象引用的作用域与对象的生命周期搞混了吧。 这里作用域没有关系。 |
|
返回顶楼 | |
发表时间: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次,它也有循环语句的。 |
|
返回顶楼 | |
发表时间: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都是有具体开销的。 |
|
返回顶楼 | |