【发布时间】:2011-04-23 04:41:42
【问题描述】:
我使用 jstack 来输出线程信息。还有一个线程: “VM 线程”prio=10 tid=0x0878b400 nid=0x760a 可运行
这个线程是用来做什么的? 它占用 50% 的 CPU 使用率和大部分 CPU 时间
【问题讨论】:
-
哪个虚拟机在什么环境下实现?
标签: java multithreading jvm
我使用 jstack 来输出线程信息。还有一个线程: “VM 线程”prio=10 tid=0x0878b400 nid=0x760a 可运行
这个线程是用来做什么的? 它占用 50% 的 CPU 使用率和大部分 CPU 时间
【问题讨论】:
标签: java multithreading jvm
VM 线程 是一个内部 JVM 线程,您不会在 JConsole 中看到它,而是在 threaddump(使用 jstack)或操作系统实用程序(例如 top (top -H .... ) 或 ps)上.
如果此 VM 线程一直占用大量 CPU,则可能是 OOM 的前兆堆错误。
这通常发生在“stop the world” GC 发生时。这可能是由于内存泄漏或在单个 CPU 和/或串行 GC 收集器上运行和/或使用无法 GC 的对象加载堆,因为它们在堆栈上处于活动状态和/或调整大小与工作流和隐含并发等相比,堆太低了。
以下示例。
复制很简单:
尝试在受约束的堆上运行(比如 256m),限制为单个 cpu(使用 docker 或特定于操作系统的实用程序),指定更多的工作线程将图像读入内存,你会看到这个命令(在 Linux 上):
top -n 1 -H -p {pid}
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10 root 20 0 3335964 395380 28380 R 60.0 19.4 0:34.71 VM Thread
【讨论】:
你怎么知道这个线程占用了 50% 的使用率?可运行并不意味着它会消耗 CPU。
AFAIK 这用于内部 java 操作,可能涉及 GC。
您使用的是哪个版本的 java?我会检查您是否有最新版本的 Java,看看是否还会出现这种情况。
我建议您对应用程序进行内存分析,以查看您正在创建多少对象,并查看是否可以减少对象数量以减少任何 GC 工作负载。
【讨论】:
我认为这是垃圾收集线程。它进行垃圾收集。
【讨论】: