作者tkcn (小安)
看板java
标题Re: [问题]new新物件的问题
时间Thu Apr 7 23:49:39 2011
※ 引述《tofuflower (无)》之铭言:
: 请问下列三种写法
: 1.
: MyObject obj;
: for(int i=0;i<10000000;i++)
: {
: obj=new MyObject();
: do something......
: }
: 2.
: for(int i=0;i<10000000;i++)
: {
: MyObject obj=new MyObject();
: do something......
: }
: 3.
: MyObject obj=new MyObject();
: for(int i=0;i<10000000;i++)
: {
: obj.init();
: do something......
: }
: 其中3是我现在的写法,但是obj.init()会花太多时间
: (比new一个新的MyObject还花时间)
听起来只是设计不当。
: 所以想请问1和2这两种写法那种比较好?
就效率来说,1 跟 2 完全感受不到差别。
撇开效率不谈,
如果 obj 在回圈之外完全用不到,
我会认为宣告在回圈之内是较好的,
差别在回圈外是否多一个没有用的变数,
可能会造成误用或阅读上的困扰。
: 2我的议题是这样每次都宣告一个新的obj,那上一个obj memory会回收吗?
: 如果会是甚麽时候回收?
: ps.一开始用过2的写法,但曾经出现过java heap size的问题...
: 感觉就是一直宣告MyObject obj=new MyObject()把记忆体塞爆?
你似乎不知道有 Garbage Collection(GC) 这东西。
简单的说,GC 会帮你做回收的动作,
只要你把指向物件的 refrence 都都拿掉,
待 GC 运作後,物件就会被回收。
你并不知道他什麽时候去做,也不能指定他立刻去做,
但大部分的情况下,我认为 GC 都运作的很不错。
在你的例子当中,
大概是因为物件产生的速度高於回收的速度,
所以最後当然会爆掉。
如果你的需求真的必须如此,
也许可以在回圈里头放个 System.gc() "建议" GC 去做事。
: 1我的议题是虽然只宣告一次obj
: 但之後也是每次都分给他一个新的memory空间...?
: 和2的写法比好像一样?
: 总之我不太了解java在甚麽时候会回收不用的记忆体?
: 而怎样的情况下该变数的记忆体会被认定为不在使用可以回收的?
你无法控制物件何时会被回收,
但只有当物件被有被 refrence 时,该物件才有可能被回收。
: 烦请有经验的版友指教
: 或者有人有推荐的书即可以介绍一下的
: 感谢 orz...
找些说明 GC 的文章来看吧,光看我说的实在是不够。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.78.231
1F:推 tofuflower:我知道GC,只是不知道系统call GC的时机为何? 04/08 00:12