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