代码之家  ›  专栏  ›  技术社区  ›  user26365

在ThreadLocal实例上强制使用GC的更好方法是什么?

  •  2
  • user26365  · 技术社区  · 15 年前

    在ThreadLocal实例上强制使用GC的更好方法是什么?

    5 回复  |  直到 15 年前
        1
  •  4
  •   Gilles    15 年前

    简单的回答是:在java中不能强制使用GC。有些人可能会贴出花招,但总的来说你根本做不到。

    好吧,事实上你可以。有出口!

        2
  •  3
  •   James Van Huis    15 年前

    简单而丑陋的答案是:

    System.gc();
    

    这不能保证特定对象的垃圾收集,但它会告诉VM努力执行常规垃圾收集。

    具体来说,对于ThreadLocal变量,包含的变量实例在线程结束或ThreadLocal实例不再可访问之前不会被GC'd。因此,您需要终止关联的线程,或者放弃对ThreadLocal变量的引用,以便 System.gc() 有任何效果。

    然而,调用此函数的事实表明代码中存在更大的问题。如果你想摆脱一个对象,仅仅没有对它的引用就足够了。虚拟机稍后会来清理你的烂摊子。

        3
  •  2
  •   Bubi S    12 年前

    您不能强制GC,在许多情况下,当您在容器中运行时,甚至调用System.GC()也没有帮助,因为JVM通常设置为-XX:+DisableExplicitGC。JVM将忽略显式调用。

        4
  •  1
  •   shams    13 年前

    这个 jlibs library has a good utility class for garbage collection . 你可以用一个漂亮的小技巧来强制垃圾回收 WeakReference 物体。

    RuntimeUtil.gc()

       /**
        * This method guarantees that garbage collection is
        * done unlike <code>{@link System#gc()}</code>
        */
       public static void gc() {
         Object obj = new Object();
         WeakReference ref = new WeakReference<Object>(obj);
         obj = null;
         while(ref.get() != null) {
           System.gc();
         }
       }
    
        5
  •  1
  •   yonran    12 年前

    一个 ThreadLocal<Object> 只是一把钥匙。实际值存储在 Thread s threadLocals弱哈希映射,它映射 虚弱的 ThreadLocal 坚强的 Object .

    假设没有人引用 对象 在一个 螺纹局部

    1. 线程完成(在内部将其threadLocals映射设置为 null ).
    2. 螺纹 s公司 ThreadLocalMap 一切都遥不可及 对象 在里面。

    但如果线程仍在运行,则此序列必须在 可垃圾收集:

    1. 你失去了所有关于 .
    2. 垃圾收集器删除 螺纹局部 .
    3. set() 一些其他的 螺纹局部 在那条线内 线程本地映射 WeakHashMap ,和 线程本地映射 一次只删除几个过时的条目,并且只在 设置() ,不是 get()
    4. 垃圾收集器最终删除 对象 .

    为了缓解垃圾收集速度慢的问题,可以调用 ThreadLocal.remove() 从每个 螺纹 如果线程不再需要对象。