我在接受采访时得到了这个问题: 假设我们创建了多个线程,如果其中一个线程调用了垃圾收集,那么其他线程中的未引用对象也会被收集吗?
答案 0 :(得分:11)
是和否。
如果其中一个线程调用了垃圾收集,是否也会收集其他线程中未引用的对象?
是。对象不是“在线程中” - 程序中运行的所有线程都有一个对象图,因此当GC发生时,无论哪个线程创建它们,或者对它们有本地引用,都会收集无法访问的对象。
没有。当线程调用Runtime.gc()
时,VM没有义务实际执行任何操作,因此可能没有GC发生且没有收集内存。例如,在命令行中指定-XX:+DisableExplicitGC
时,它无效。
调用此方法建议 Java虚拟机花费精力回收未使用的对象,以使其当前占用的内存可用于快速重用。
没有。即使GC发生,也不一定会收集所有只能从一个线程的堆栈中到达的无法访问的对象,因为世代GC只处理对象图的子集,并且如果该子集恰好包含由a创建的所有无法访问的对象。特别是线程,这只是巧合。