我正在阅读JVM中的垃圾收集器。并且写道,在收集的某些阶段,应用程序线程被停止。
我不确定JVM(线程所有者)如何停止线程。我不确定JVM thread
如何控制创建的线程。我看到java
进程是该线程的所有者,但到那一天我没有看到停止运行线程的方法。我想,我隐含地假设Java包装Unix线程。 (请解释这个问题,因为我不确定)。
答案 0 :(得分:2)
JVM可以控制线程,因为线程协作。只有几种可能性:
线程可能正在执行JVM本身的代码,例如口译员。然后,显然,该代码可以包含检查是否需要线程暂停。
它可以执行生成的代码,将字节代码编译为本机代码的结果。由于JVM的代码生成器生成了该代码,因此它会在“安全点”插入必要的代码以支持线程暂停。
它可以执行不支持线程暂停的任意本机代码。在这种情况下,无关紧要,因为该代码不会干扰垃圾收集等服务。访问Java堆的唯一方法是通过JVM提供的接口,如JNI。当然,只要本机代码调用JVM提供的函数来访问堆,JVM就可以控制操作,并且可以暂停该线程,直到正在进行的垃圾收集结束。
确切的机制,例如如何在低级别上实现安全点,了解JVM始终可以控制可能干扰垃圾收集等进程的所有堆访问并不重要。只需要停止那些线程。
答案 1 :(得分:0)
如果通过"系统线程"你指的是JVM之外的线程,这是不可能的!
否则,
<强> Safepoints!强>
程序执行期间所有GC根已知并且所有堆都已填充的点 对象内容是一致的。从全球的角度来看,所有 在GC可以运行之前,线程必须在安全点阻塞。
从本地的角度来看,安全点是a中的一个显着点 执行线程可能阻止GC的代码块。
可以简单地认为,正在运行的线程的状态是明确定义的,并且它们已经准备好被阻止(如果它们已经不存在)。