多线程垃圾收集

Edm*_*ond 3 java multithreading garbage-collection

可能重复:
垃圾收集和线程

我在接受采访时得到了这个问题:假设我们创建了多个线程,如果其中一个线程调用了垃圾收集,那么其他线程中的未引用对象也会被收集吗?

Mik*_*uel 11

是的,不是.

如果其中一个线程调用垃圾收集,是否还会收集其他线程中未引用的对象?

是.对象不是"在线程中" - 程序中运行的所有线程都有一个对象图,因此当GC发生时,无论哪个线程创建它们,或者对它们有本地引用,都会收集无法访问的对象.

当线程调用Runtime.gc()VM没有义务实际执行任何操作时,可能没有GC发生且没有收集内存.例如-XX:+DisableExplicitGC,在命令行中指定它时没有任何效果.

Runtime.gc()

调用此方法表明 Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用.

不会.即使GC发生,也不一定会收集所有只能从一个线程堆栈中到达的无法访问的对象,因为世代GC只处理对象图的一个子集,并且该子集恰好包含创建的所有无法访问的对象通过一个特定的线程然后它只是巧合.