java是什么;“虚拟机线程”;做

java是什么;“虚拟机线程”;做,java,multithreading,jvm,Java,Multithreading,Jvm,我使用jstack输出线程信息。这里有一条线索: “VM线程”优先级=10 tid=0x0878b400 nid=0x760a可运行 这条线是用来做什么的? 它占用了50%的CPU使用率和大部分CPU时间我认为这是垃圾收集线程。它进行垃圾收集。您如何知道此线程占用了50%的使用率?可运行并不意味着它会消耗cpu AFAIK这用于内部java操作,可能涉及GC 您使用的是哪个版本的java?我会检查您是否有最新版本的Java,看看这种情况是否仍然存在 我建议您对应用程序进行内存配置,以查看您正在创

我使用jstack输出线程信息。这里有一条线索: “VM线程”优先级=10 tid=0x0878b400 nid=0x760a可运行

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

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

您如何知道此线程占用了50%的使用率?可运行并不意味着它会消耗cpu

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

您使用的是哪个版本的java?我会检查您是否有最新版本的Java,看看这种情况是否仍然存在

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

VM线程定义为:

该线程等待需要JVM到达安全点的操作出现。这些操作必须在单独的线程上进行的原因是,它们都要求JVM处于一个安全点,在这个安全点上不能修改堆。此线程执行的操作类型包括“停止世界”垃圾收集、线程堆栈转储、线程挂起和有偏锁定撤销


在重复数据消除的SO答案中还提供了一些信息。

虚拟机线程是一个内部JVM线程,您在JConsole中看不到这一点,但在
线程转储中(使用
jstack
)或操作系统实用程序(如
top(top-H…)
ps

如果此VM线程持续占用大量CPU,则可能是OOM堆错误的前兆

这通常发生在“停止世界”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