linux - JVM控制系统线程

标签 linux multithreading jvm

我正在阅读 JVM 中的垃圾收集器。据记载,在收集的某些阶段,应用程序线程会停止。

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

最佳答案

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

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

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

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

确切的机制,例如如何在底层实现安全点,对于了解 JVM 始终控制所有可能会干扰垃圾收集等进程的堆访问并不重要。并且只有那些线程需要停止。

关于linux - JVM控制系统线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46391844/

相关文章:

python - 如何在Python中获取手动锁定机制的进程PID?

java - 两把锁的守护状态

jvm - klassoop 和 instanceklass 之间的真正区别是什么?

windows - Unix/Linux 线程的默认内存块?

java - 如何摆脱 java.lang.OutOfMemoryError : Java heap space

java - 为什么我收到 JVM 最大堆空间错误?

c - 为什么添加变量后.bss段没有增加?

linux - 生成推荐选项的 zsh 选项

linux - perl sdl 模块安装失败

xml - 使用 XDocument.Load 的多线程