锁定老帖子 主题:Java中的垃圾回收与对象生命周期
精华帖 (5) :: 良好帖 (2) :: 新手帖 (5) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-21
wangzaixiang 写道 写了很多,错误不少。
1. 而栈内存则是用来存储程序代码中声明为静态或非静态的方法。 完全错误的表达。 2、为对象分配存储空间; <2> 开始构造对象; <3> 从超类到子类对static成员进行初始化; <4> 超类成员变量按顺序初始化,递归调用超类的构造方法; <5> 子类成员变量按顺序初始化,子类构造方法调用。 static的初始化与new操作没有任何关系。 3、比如: 不要写成: for (int i = 0; i < 10000; i++) { Object obj = new Object(); System.out.println(obj); } 要写成: Object obj = null; for (int i = 0; i < 10000; i++) { obj = new Object(); System.out.println(obj); } 完全错误。两者在运行时几无差别,前置在编码风格上更为合理。 4、 (5) 可收集阶段、终结阶段与释放阶段 当一个对象处于可收集阶段、终结阶段与释放阶段时,该对象有如下三种情况: <1> 回收器发现该对象已经不可达。 <2> finalize方法已经被执行。 <3> 对象空间已被重用。 前面的理解都不正确,这里的表述更为问题多多。 1. 而栈内存则是用来存储程序代码中声明为静态或非静态的方法。 完全错误的表达。 请您解释下? 2. static的初始化与new操作没有任何关系。放屁 3.完全错误。两者在运行时几无差别,前置在编码风格上更为合理。 理由? 4. 请解释。 |
|
返回顶楼 | |
发表时间:2010-06-21
wangzaixiang 写道 maozj 写道 i2534 写道 J-catTeam 写道 比如:
不要写成: for (int i = 0; i < 10000; i++) { Object obj = new Object(); System.out.println(obj); } 要写成: Object obj = null; for (int i = 0; i < 10000; i++) { obj = new Object(); System.out.println(obj); } 看应用场景的 貌似前几天javaeye上有个帖子阐述了这个问题,说的是两个方式现在的jvm已经是一样的速度了. ---------------------- 恩, 你这提法正确 现在JVM速度可以媲美了的 呵呵 我没有实际测试,但我可以肯定: 从JDK1.1开始,到现在的JDK1.6,后面这段代码都不可能比前面的代码快,理论上只会更慢,因为后者还多了一条初始化指令。 不信,你尝试用javap -c看看。 有哪位认为第二种情况会更快的(哪怕是千万分之一),说说你们的想法? static的初始化与new操作没有任何关系。 居然在帖子下言论出这样的语句, 不是想发脾气,而是忍不住书本说明带来的误解~~ 更忍不住作为一名程序员对问题的理解和表达~~~ 以上纯属主观情绪,不针对人,只针对表述 |
|
返回顶楼 | |
发表时间:2010-06-21
new的时候会载入类吗? 载入类的时候会执行static、static快吗? 执行static时会初始化吗?
|
|
返回顶楼 | |
发表时间:2010-06-21
没有任何关系? 这里表述的重点是顺序和关联, 书本上说new与static没有任何关系了吗? 如果说了,就是对的吗? 当然研究它们的关系没得意义
|
|
返回顶楼 | |
发表时间:2010-06-21
for (int i = 0; i < 10000; i++) {
Object obj = new Object(); System.out.println(obj); } 要写成: Object obj = null; for (int i = 0; i < 10000; i++) { obj = new Object(); System.out.println(obj); } 大家都感觉作者说的是错误的,但是并没有说出为什么,因此作者毛了,呵呵 其实,作者的意思是这么写会造成很多引用留在栈里面,但是作者还有个东西没有考虑,就是作用域。 句柄会随着作用域消失而消失,因此上面的2种写法,对于句柄来说不会不断扩大,作者可以放心使用。 |
|
返回顶楼 | |
发表时间:2010-06-21
joinhack 写道 for (int i = 0; i < 10000; i++) {
Object obj = new Object(); System.out.println(obj); } 要写成: Object obj = null; for (int i = 0; i < 10000; i++) { obj = new Object(); System.out.println(obj); } 大家都感觉作者说的是错误的,但是并没有说出为什么,因此作者毛了,呵呵 其实,作者的意思是这么写会造成很多引用留在栈里面,但是作者还有个东西没有考虑,就是作用域。 句柄会随着作用域消失而消失,因此上面的2种写法,对于句柄来说不会不断扩大,作者可以放心使用。 恩 成很多引用留在栈里面 说的正确。。。 Object obj = null; 后者还多了一条初始化 您的说法 完全接受。。。 表述不错 足见很有方法哲理~~ |
|
返回顶楼 | |
发表时间:2010-06-21
首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的
|
|
返回顶楼 | |
发表时间:2010-06-21
最后修改:2010-06-21
61234865 写道 首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的
"其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。" 恩,这个你验证过了,我表示赞同。我也是在摸索阶段中,但不确定怎么样的验证才能足以说明大师的"理论"。 "个人认为能解决问题才是最终目的...”这句话曾是我以前所信奉的,毕竟在公司老板要的就是你要解决问题,这才是他最想要的,他不管你使用何种手段,何种方法只要把问题解决,不在出现那个问题了,他就会点头。 但是在那些技术总监眼里,它们根本不把这放在眼里(可能是针对技术的),他不然要求你把问题解决了,还要用合理的,最有效率的办法,只有这样,才是所谓的最程序员职业的尊重。不谈那么多了,其实,说的透彻点,80%的人都会认同“解决问题才是最终目的”, 毕竟现代社会是个高消费,高效率的社会。。。 |
|
返回顶楼 | |
发表时间:2010-06-21
maozj 写道 61234865 写道 首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的
"其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。" 恩,这个你验证过了,我表示赞同。我也是在摸索阶段中,但不确定怎么样的验证才能足以说明大师的"理论"。 "个人认为能解决问题才是最终目的...”这句话曾是我以前所信奉的,毕竟在公司老板要的就是你要解决问题,这才是他最想要的,他不管你使用何种手段,何种方法只要把问题解决,不在出现那个问题了,他就会点头。 但是在那些技术总监眼里,它们根本不把这放在眼里(可能是针对技术的),他不然要求你把问题解决了,还要用合理的,最有效率的办法,只有这样,才是所谓的最程序员职业的尊重。不谈那么多了,其实,说的透彻点,80%的人都会认同“解决问题才是最终目的”, 毕竟现代社会是个高消费,高效率的社会。。。 我想是你理解错误的我的意思了,我说的“个人认为能解决问题才是最终目的”是指在技术框架的和技术规范的前提下解决问题,并不是说哪有问题改哪,没有一点逻辑性和规范性,呵呵 ,都是做软件的,说白了,在相同的能力水平的前提下,代码的质量,关键是看个人的责任心了 |
|
返回顶楼 | |
发表时间:2010-06-21
呵呵,楼主扯远了,扯远了,偏离讨论方向了。顺便问下作者在那个公司。
|
|
返回顶楼 | |