论坛首页 Java企业应用论坛

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

浏览 18255 次
精华帖 (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. 请解释。
0 请登录后投票
   发表时间: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操作没有任何关系。 居然在帖子下言论出这样的语句, 不是想发脾气,而是忍不住书本说明带来的误解~~ 更忍不住作为一名程序员对问题的理解和表达~~~ 以上纯属主观情绪,不针对人,只针对表述
0 请登录后投票
   发表时间:2010-06-21  
new的时候会载入类吗? 载入类的时候会执行static、static快吗? 执行static时会初始化吗?
0 请登录后投票
   发表时间:2010-06-21  
没有任何关系? 这里表述的重点是顺序和关联, 书本上说new与static没有任何关系了吗? 如果说了,就是对的吗? 当然研究它们的关系没得意义
0 请登录后投票
   发表时间: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种写法,对于句柄来说不会不断扩大,作者可以放心使用。
0 请登录后投票
   发表时间: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;  后者还多了一条初始化

您的说法 完全接受。。。 表述不错 足见很有方法哲理~~
0 请登录后投票
   发表时间:2010-06-21  
首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的
0 请登录后投票
   发表时间:2010-06-21   最后修改:2010-06-21
61234865 写道
首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的

 
   "其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。"

    恩,这个你验证过了,我表示赞同。我也是在摸索阶段中,但不确定怎么样的验证才能足以说明大师的"理论"。

    "个人认为能解决问题才是最终目的...”这句话曾是我以前所信奉的,毕竟在公司老板要的就是你要解决问题,这才是他最想要的,他不管你使用何种手段,何种方法只要把问题解决,不在出现那个问题了,他就会点头。

     但是在那些技术总监眼里,它们根本不把这放在眼里(可能是针对技术的),他不然要求你把问题解决了,还要用合理的,最有效率的办法,只有这样,才是所谓的最程序员职业的尊重。不谈那么多了,其实,说的透彻点,80%的人都会认同“解决问题才是最终目的”, 毕竟现代社会是个高消费,高效率的社会。。。
0 请登录后投票
   发表时间:2010-06-21  
maozj 写道
61234865 写道
首先对作者表示感谢,上面的内容,因为我也不是java方面的高手,对于正确与否,我就不做评价了,但有一点要说明的是,对象用完后,一旦不再使用就置空,这个做法我深表赞同,因为我们现在的项目中就大量使用了此技巧,我们的项目是多线程的,在没有进行置空操作时,内存要1G以上才能稳定运行,现在进行置空处理后,200多M的内存就能很稳定的运行了,性能提升是巨大的。其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。呵呵 ,我只是用我们现在项目的实例来说明强行指定null会对性能带来巨大的提升,尤其是多线程的时候更明显。就说这么多吧,至于其它的,我不想多讨论,因为个人认为能解决问题才是最终目的

 
   "其实以前我也认为当代码中所谓的“不可见”出现后,JVM会自动 把对象GC的,但通过现在这个项目发现,根本不是这么回事。"

    恩,这个你验证过了,我表示赞同。我也是在摸索阶段中,但不确定怎么样的验证才能足以说明大师的"理论"。

    "个人认为能解决问题才是最终目的...”这句话曾是我以前所信奉的,毕竟在公司老板要的就是你要解决问题,这才是他最想要的,他不管你使用何种手段,何种方法只要把问题解决,不在出现那个问题了,他就会点头。

     但是在那些技术总监眼里,它们根本不把这放在眼里(可能是针对技术的),他不然要求你把问题解决了,还要用合理的,最有效率的办法,只有这样,才是所谓的最程序员职业的尊重。不谈那么多了,其实,说的透彻点,80%的人都会认同“解决问题才是最终目的”, 毕竟现代社会是个高消费,高效率的社会。。。

我想是你理解错误的我的意思了,我说的“个人认为能解决问题才是最终目的”是指在技术框架的和技术规范的前提下解决问题,并不是说哪有问题改哪,没有一点逻辑性和规范性,呵呵 ,都是做软件的,说白了,在相同的能力水平的前提下,代码的质量,关键是看个人的责任心了
0 请登录后投票
   发表时间:2010-06-21  
呵呵,楼主扯远了,扯远了,偏离讨论方向了。顺便问下作者在那个公司。
0 请登录后投票
论坛首页 Java企业应用版

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