Java Linux顶级输出不切实际?
我遇到了一个奇怪的问题,java进程正在linux虚拟机上消耗大量资源。 流程的top输出如下所示:Java Linux顶级输出不切实际?,java,linux,Java,Linux,我遇到了一个奇怪的问题,java进程正在linux虚拟机上消耗大量资源。 流程的top输出如下所示: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1182 blabla 20 0 25.5g 21g 45m S 382.9 33.9 139840:17 java 这表明这个进程实际上消耗了21G的物理内存 在更详细地检查流程时,我可以看到它是以-Xmx4G启动的。对于“顶部”显示的21
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1182 blabla 20 0 25.5g 21g 45m S 382.9 33.9 139840:17 java
这表明这个进程实际上消耗了21G的物理内存
在更详细地检查流程时,我可以看到它是以-Xmx4G启动的。对于“顶部”显示的21G,是否有任何逻辑解释?
(忽略下面ps输出的第一个-Xmx)
。。。
这表明这个进程实际上消耗了21G的物理内存
对。“top”命令报告操作系统提供的进程物理内存使用情况。没有理由不相信它
对于“顶部”显示的21G,是否有任何逻辑解释
它可能是大量的堆外内存分配,或者是一个大的内存映射文件,或者。。。大量线程堆栈
或者潜在的其他事情
请注意,VIRT
图以某种方式表示已提交到进程的总虚拟内存。“RES”图表示保存当前“分页”的“VIRT”图子集的总物理内存使用量
因此,VIRT图是对Java进程所需内存资源的更好衡量。VIRT和RES如此不同的事实证明了您的过程导致了“颠簸”
另见:
VIRT
图以某种方式表示已提交到进程的总虚拟内存。“RES”图表示保存当前“分页”的“VIRT”图子集的总物理内存使用量
因此,VIRT图是对Java进程所需内存资源的更好衡量。VIRT和RES如此不同的事实证明了您的过程导致了“颠簸”
另见:
-Xmx
控制最大堆大小-基本上是存储使用new
关键字创建的内容的位置
Java还有其他内存池——用于执行堆栈、缓存JIT编译的代码、存储加载的类和动态创建的类、内存映射文件、本机代码(JNI或热点本身)使用的堆空间:请参阅
JConsole是一个可以用来查看Java程序使用内存的工具。一旦JConsole告诉您哪个区域是大的/满的,您就可以开始思考为什么它会这样
例如,我曾经有一个程序,在每次解析时都会加载一个新的Jackson对象映射器,而这个版本的Jackson有一个bug,它在非堆内存中留下了动态类,而这些类从来没有得到GCd。你的问题可能是这个,也可能是完全不同的东西。JConsole会告诉你的。
-Xmx
控制最大堆大小-基本上是存储用新建关键字创建的内容的位置
Java还有其他内存池——用于执行堆栈、缓存JIT编译的代码、存储加载的类和动态创建的类、内存映射文件、本机代码(JNI或热点本身)使用的堆空间:请参阅
JConsole是一个可以用来查看Java程序使用内存的工具。一旦JConsole告诉您哪个区域是大的/满的,您就可以开始思考为什么它会这样
例如,我曾经有一个程序,在每次解析时都会加载一个新的Jackson对象映射器,而这个版本的Jackson有一个bug,它在非堆内存中留下了动态类,而这些类从来没有得到GCd。你的问题可能是这个,也可能是完全不同的东西。JConsole会告诉你的。我明白了-Xmx128M
,而不是-Xmx4G
。我怀疑这里发生了一些混乱。好的,现在我看到-Xmx4G1
。当您有多个该标志副本时会发生什么?更重要的是,您如何知道您没有更多的该标志副本?也许auxwww或类似的Xmx控制虚拟机将分配的最大堆大小。Top显示进程使用的内存,堆只是其中的一部分。可能是某些本机模块出了问题。要查看虚拟机内存中发生的情况,您必须使用探查器连接到虚拟机。请按照StephenC的建议查看应用程序的堆外存储。您的堆存储不能超过4g,因为您指定了-Xmx4g(请消除重复)。这确实暗示了内存映射文件、许多堆栈(什么是-Xss?)等等。我看到的是-Xmx128M
,而不是-Xmx4G
。我怀疑这里发生了一些混乱。好的,现在我看到-Xmx4G1
。当您有多个该标志副本时会发生什么?更重要的是,您如何知道您没有更多的该标志副本?也许auxwww或类似的Xmx控制虚拟机将分配的最大堆大小。Top显示进程使用的内存,堆只是其中的一部分。可能是某些本机模块出了问题。要查看虚拟机内存中发生的情况,您必须使用探查器连接到虚拟机。请按照StephenC的建议查看应用程序的堆外存储。您的堆存储不能超过4g,因为您指定了-Xmx4g(请消除重复)。这确实暗示了内存映射文件、许多堆栈(什么是-Xss?)等等
blabla@dtraflocorh391:~ $ ps aux | grep 1182
blabla 1182 249 33.8 26716716 22363868 ? Sl Feb13 139847:01 java -Xms32M -Xmx128M -showversion -Djavax.xml.stream.XMLEventFactory=com.ctc.wstx.stax.WstxEventFactory -Djavax.xml.stream.XMLInputFactory=com.ctc.wstx.stax.WstxInputFactory -Djavax.xml.stream.XMLOutputFactory=com.ctc.wstx.stax.WstxOutputFactory -Xms256M -Xmx4G -verbose:gc -XX:+PrintGCTimeStamps ... ... ...