日期:2014-05-20  浏览次数:20837 次

java在sleep时,会进行垃圾回收吗
大家好,我目前有一个POJO对象, 该对象中具有很多属性(会有对象属性及继续深入的嵌套):
class MyObject {
  private String str1;
  private String str2;
  private Object obj1;
  private List<Object> objList;
  ....
}
当该对象初始化,进行一系列操作后,有一些属性,程序已不再需要,因此我希望能将这些属性占用的内存回收。如:我不再需要objList这个对象属性。
以下代码,表示最终将MyObject的一个对象的objList属性置null,但JVM不会马上回收
MyObject myobj = new MyObject();
// ... business logic
myobj.setObjList(null);
问1:
System.gc(); // 假设加了这一句,效果会比不加好吗?
问2:
// 以下情况会比“问1”中的好吗?
Thread.sleep(2000L);
System.gc();

谢谢~

------解决方案--------------------
它俩应该是同步的。
就算你不sleep,jvm该进行垃圾回收照样去垃圾回收。

------解决方案--------------------
当然不会导致gc线程sleep,gc一般都是有个策略的,并不是等一下它就有了,比如一个可能的策略是:已使用的堆内存占了总堆内存的80%,这时候触发gc;且流行的jvm实现上都可以用参数对gc策略进行调整

探讨

引用:

java应用中的线程和gc线程没有直接关系,gc是jvm后台守护线程

System.gc()只是提示jvm进行gc,但是jvm理不理你的提示,那就不知道了

就像你妈妈喊你回家吃饭,你可能马上就回去了,也可能过会再回去,还可能懒得理

那在sleep的时候,后台线程会不会也sleep?我在这儿写sleep的目的,是希望尽量能给JVM足够的时间,让其回……

------解决方案--------------------
sleep只是休眠一段时间,跟垃圾回收没关系。如果想自己回收,在创建的对象使用完后,把它设置为null