作者tofuflower (无)
看板java
标题Re: [问题]new新物件的问题
时间Fri Apr 8 00:19:57 2011
※ 引述《tkcn (小安)》之铭言:
: ※ 引述《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 的文章来看吧,光看我说的实在是不够。
感谢您的回覆~
推文麻烦
还是回文好了
我知道java 有GC
但是不确定系统会自己做GC的时间为何
(要评估自己使用GC还是给系统自动使用GC)
以及GC回收的记忆体是那些?
例如
MyObject obj=new MyObject(); //第一次分配记忆体给obj
obj=new MyObject(); //分配新的记忆体给obj
那GC以後是第一次分配的记忆体会被回收吗?
init内部已经没可以优化的空间了...orz
不然我也不会那麽苦恼qq
btw
有办法侦测目前jvm使用记忆体的情况然後决定是否要使用GC吗...
例如
if(记忆体快用完了)
{
使用GC
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.164.159.249
※ 编辑: tofuflower 来自: 218.164.159.249 (04/08 00:20)
1F:→ james732:你可以查查看上篇文章「System.gc();」这东东的意义 04/08 00:29
2F:→ james732:Java的GC不是三言两语可以说尽,建议google看相关资料 04/08 00:30
3F:→ james732:千万不要没查过System.gc();就随便用,上次这麽做的人... 04/08 00:34
4F:→ legnaleurc:草已经长这麽高了 04/08 03:01
5F:→ sk8er411:= =楼上的有没有这麽幽默! 04/22 23:12