我知道当新对象分配失败或调用System.gc()时,垃圾回收机制会被触发。每种垃圾回收算法都建议在第一步中,垃圾回收线程将暂停所有应用程序线程,以便它们不会影响垃圾回收活动。
但是我想了解垃圾回收如何暂停所有正在运行的线程?我的意思是JVM是否定义了安全点,例如内存分配(新对象创建)或方法调用,当应用程序线程到达这些安全点时,它们将被阻止针对GC锁定。这是真的吗?如果是这样,那么以下仅执行简单计算的应用程序线程(我知道在现实中这是不可能的),它会被暂停吗?
在这些情况下,GC活动是否会在不挂起这些应用程序线程的情况下继续进行(并在它们尝试穿过安全点时暂停/阻塞,例如对象分配)?
但我相信,GC总是等待这些应用程序线程进入安全点并在继续之前将它们挂起。我的假设是正确的吗?
但是我想了解垃圾回收如何暂停所有正在运行的线程?我的意思是JVM是否定义了安全点,例如内存分配(新对象创建)或方法调用,当应用程序线程到达这些安全点时,它们将被阻止针对GC锁定。这是真的吗?如果是这样,那么以下仅执行简单计算的应用程序线程(我知道在现实中这是不可能的),它会被暂停吗?
while(true) {
a = a + s;
s = s + a;
// some computation that doesn't touch any JVM safe points
}
在这些情况下,GC活动是否会在不挂起这些应用程序线程的情况下继续进行(并在它们尝试穿过安全点时暂停/阻塞,例如对象分配)?
但我相信,GC总是等待这些应用程序线程进入安全点并在继续之前将它们挂起。我的假设是正确的吗?
System.gc()
并不能保证垃圾回收。它取决于多个JVM特定参数。 - Aniket Thakur