通过JVM控制系统线程

时间:2017-09-24 15:41:59

标签: linux multithreading jvm

我正在阅读JVM中的垃圾收集器。并且写道,在收集的某些阶段,应用程序线程被停止。

我不确定JVM(线程所有者)如何停止线程。我不确定JVM thread如何控制创建的线程。我看到java进程是该线程的所有者,但到那一天我没有看到停止运行线程的方法。我想,我隐含地假设Java包装Unix线程。 (请解释这个问题,因为我不确定)。

2 个答案:

答案 0 :(得分:2)

JVM可以控制线程,因为线程协作。只有几种可能性:

  1. 线程可能正在执行JVM本身的代码,例如口译员。然后,显然,该代码可以包含检查是否需要线程暂停。

  2. 它可以执行生成的代码,将字节代码编译为本机代码的结果。由于JVM的代码生成器生成了该代码,因此它会在“安全点”插入必要的代码以支持线程暂停。

  3. 它可以执行不支持线程暂停的任意本机代码。在这种情况下,无关紧要,因为该代码不会干扰垃圾收集等服务。访问Java堆的唯一方法是通过JVM提供的接口,如JNI。当然,只要本机代码调用JVM提供的函数来访问堆,JVM就可以控制操作,并且可以暂停该线程,直到正在进行的垃圾收集结束。

  4. 确切的机制,例如如何在低级别上实现安全点,了解JVM始终可以控制可能干扰垃圾收集等进程的所有堆访问并不重要。只需要停止那些线程。

答案 1 :(得分:0)

如果通过"系统线程"你指的是JVM之外的线程,这是不可能的!

否则,

<强> Safepoints!

来自openjdk HotSpot glossary

  

程序执行期间所有GC根已知并且所有堆都已填充的点   对象内容是一致的。从全球的角度来看,所有   在GC可以运行之前,线程必须在安全点阻塞。

     

从本地的角度来看,安全点是a中的一个显着点   执行线程可能阻止GC的代码块。

可以简单地认为,正在运行的线程的状态是明确定义的,并且它们已经准备好被阻止(如果它们已经不存在)。

相关问题