3

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

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

4

1 回答 1

12

是和不是。

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

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

不会。当线程调用Runtime.gc()虚拟机时,虚拟机没有义务实际执行任何操作,因此可能没有发生 GC,也没有收集内存。例如,-XX:+DisableExplicitGC在命令行中指定时无效。

Runtime.gc()

调用此方法表明Java 虚拟机花费精力回收未使用的对象,以使它们当前占用的内存可用于快速重用。

不。即使发生 GC,也不一定会收集只能从一个线程的堆栈中访问的所有无法访问的对象,因为分代 GC 仅处理对象图的子集,并且如果该子集恰好包含创建的所有无法访问的对象通过一个特定的线程,那么这只是巧合。

于 2013-01-28T03:45:30.360 回答