【问题标题】:What does java "VM thread" do?java“VM线程”有什么作用?
【发布时间】:2011-04-23 04:41:42
【问题描述】:

我使用 jstack 来输出线程信息。还有一个线程: “VM 线程”prio=10 tid=0x0878b400 nid=0x760a 可运行

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

【问题讨论】:

  • 哪个虚拟机在什么环境下实现?

标签: java multithreading jvm


【解决方案1】:

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  

【讨论】:

    【解决方案2】:

    VM 线程定义为here

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

    在去重的 SO 答案here 中还提供了一些信息。

    【讨论】:

      【解决方案3】:

      你怎么知道这个线程占用了 50% 的使用率?可运行并不意味着它会消耗 CPU。

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

      您使用的是哪个版本的 java?我会检查您是否有最新版本的 Java,看看是否还会出现这种情况。

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-18
          • 2011-07-12
          • 2011-11-07
          • 1970-01-01
          • 2016-12-12
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          相关资源
          最近更新 更多