大家好,我目前有一个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();谢谢~

解决方案 »

  1.   

    当以后的代码不再应用你的引用时,jvm帮你弄了,特殊情况你可以System.gc();但sleep不会收,
      

  2.   

    java应用中的线程和gc线程没有直接关系,gc是jvm后台守护线程System.gc()只是提示jvm进行gc,但是jvm理不理你的提示,那就不知道了就像你妈妈喊你回家吃饭,你可能马上就回去了,也可能过会再回去,还可能懒得理
      

  3.   

    sleep和垃圾回收没有关系,你调用一下System.gc()敦促一下就行了,什么时候回收也是不确定的。
      

  4.   

    那在sleep的时候,后台线程会不会也sleep?我在这儿写sleep的目的,是希望尽量能给JVM足够的时间,让其回收垃圾。不知该想法是否正确?
    谢谢~
      

  5.   

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

  6.   

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

  7.   

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