java“VM线程”做什么?

时间:2010-10-09 06:28:16

标签: java multithreading jvm

我使用jstack输出线程信息。并且有一个主题: “VM Thread”prio = 10 tid = 0x0878b400 nid = 0x760a runnable

这个线程用来做什么? 它需要50%的CPU使用率和大部分CPU时间

4 个答案:

答案 0 :(得分:1)

我认为这是垃圾收集线程。它做垃圾收集。

答案 1 :(得分:1)

VM线程被定义为here

  

此线程等待出现需要JVM到达安全点的操作。这些操作必须在单独的线程上发生的原因是因为它们都需要JVM处于不能对堆进行修改的安全点。这个线程执行的操作类型是" stop-the-world"垃圾收集,线程堆栈转储,线程挂起和偏置锁定撤销。

还有一些重复数据删除的答案here中提供了一些信息。

答案 2 :(得分:0)

你怎么知道这个帖子占用了50%?可运行并不意味着它消耗cpu。

AFAIK这用于内部java操作,可能涉及GC。

您使用的是哪个版本的Java?我会检查你是否有Java的最新版本,看看是否仍然会发生这种情况。

我建议您对应用程序进行内存配置文件,以查看您正在创建的对象数量,并查看是否可以减少对象数以减少任何GC工作负载。

答案 3 :(得分:0)

VM 线程是一个内部 JVM 线程,您不会在 JConsole 中看到它,而是在 threaddump(使用 jstack)或操作系统实用程序(例如 {{1 }} 或 top (top -H .... )

这个虚拟机线程如果持续占用大量 CPU 可能是OOM 的前兆 堆错误。

这通常会在“停止世界”GC 发生时发生。这可能是由于内存泄漏或与在单个 CPU 和/或串行 GC 收集器上运行和/或使用无法 GC 的对象加载堆一样无害,因为它们在堆栈上处于活动状态和/或调整大小与工作流和隐含并发等相比,堆太低了。

示例如下。

复制很简单:

尝试在受约束的堆(比如 256m)上运行,限制为单个 cpu(使用 docker 或操作系统特定的实用程序),指定更多的工作线程将图像读入内存,你会看到这个命令(在 linux 上):

ps