4

我最近开始在 Linux 线程的情况下使用 Java 进行多线程编程,我知道内核会调度它们(因为它们是被调度的单元实体)但是 java 程序运行在我的系统(RHEL 6.1)中的 JVM 上是实现为作为用户空间实例运行的程序。那么,在内核不知道 java 线程的情况下,如何在 JVM 中完成抢占式多任务处理?如果给出做这件事时 JVM 和内核交互的整个机制将会很有帮助。

请引用可能的信息来源

4

4 回答 4

3

java/JVM 进程中的线程映射到本地线程,您可以在线程堆栈跟踪转储中看到 java 线程 id 和本地线程 id。使用您喜欢的工具获取所有 java 线程的线程堆栈:

  • 运行 java 程序的控制台中的命令行信号,如 ctrl+break (windows) 或 ctrl+\ linux)
  • 命令行工具(kill -QUIT 或 jdk 中的 jstack)
  • jdk 和/或 jmx 等中的视觉 vm

从此类线程转储的第一行中提取示例: ... tid=0x0000002adaba9c00 nid=0x754c ...

  • tid = java线程id

  • nid = 本机 id(操作系统线程 id)

使用操作系统的工具来了解有关使用本机 id 的线程的更多信息(它是十六进制的)。

如果你想要 http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html ,在 java 代码中你有 ThreadMXBean 以编程方式检索更多线程信息

于 2012-03-27T14:24:16.880 回答
2

阅读区分 Java 线程和 OS 线程? 正如我在评论中所说,Java 线程是仅运行 JVM 代码的普通操作系统线程

于 2012-03-27T13:56:33.747 回答
1

jvm 只是一个正常的进程,它从一个线程开始,然后可以生成它喜欢的尽可能多的线程。调度在两个级别上完成 - 进程之间和进程内的线程之间。所有这些都是由操作系统(通过库)完成的——jvm 只是挂钩。谷歌 posix 线程了解更多细节——这就是 jvm 暴露的内容(API)。

这有点详细: http ://www.ibm.com/developerworks/java/library/j-rtj3/

于 2012-03-27T14:23:53.960 回答
0

“但是java程序在JVM上运行,在我的系统(RHEL 6.1)中被实现为作为用户空间实例运行的程序。所以,内核不知道java线程......”

对于所有使用本机线程的现代 JVM,此语句是不正确的。我认为这是自 Java 1.2 以来的默认设置。JVM 的本机线程实现意味着每次线程在 Java 代码中实例化/运行线程时,JVM 都会要求操作系统创建线程。由于这些是本机线程,内核知道它们并相应地对待它们。此外,Linux 支持/实现 POSIX 线程,因此在基于 Linux 的系统上,您将获得 Java 应用程序线程的 pthread 行为

于 2012-06-25T07:16:24.907 回答