java - 多线程垃圾回收

标签 java multithreading garbage-collection

<分区>

Possible Duplicate:
Garbage Collection and Threads

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

最佳答案

是也不是。

if one of the threads calls garbage collection, will the un-referenced objects in other threads be collected also?

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

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

Runtime.gc()

Calling this method suggests that the Java virtual machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse.

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

关于java - 多线程垃圾回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14555095/

相关文章:

java - 同时运行两个线程,然后在它们之间进行通信

javascript - JavescriptInterface 和线程不返回主线程

.net - MonoTouch 和 IDisposable 模式

java - 我的登录函数中数组列表第二个第三位的值匹配时出错?

Java:使用 String.indexOf() 检查撇号字符

Eclipse:LD_LIBRARY_PATH、OpenJDK 和 libjpeg

Java 8 lambda 弱引用

c# - 您如何向 C#/Java 开发人员解释 C++ 指针?

java - 应用程序需要很长时间才能终止

.net - 如果您坚持使用 .NET 中的标准编码,是否有理由手动调用 GC 或运行终结器?