Java Linux顶级输出不切实际?

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

我遇到了一个奇怪的问题,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启动的。对于“顶部”显示的21G,是否有任何逻辑解释? (忽略下面ps输出的第一个-Xmx)

。。。

这表明这个进程实际上消耗了21G的物理内存

对。“top”命令报告操作系统提供的进程物理内存使用情况。没有理由不相信它

对于“顶部”显示的21G,是否有任何逻辑解释

它可能是大量的堆外内存分配,或者是一个大的内存映射文件,或者。。。大量线程堆栈

或者潜在的其他事情

请注意,
VIRT
图以某种方式表示已提交到进程的总虚拟内存。“RES”图表示保存当前“分页”的“VIRT”图子集的总物理内存使用量

因此,VIRT图是对Java进程所需内存资源的更好衡量。VIRT和RES如此不同的事实证明了您的过程导致了“颠簸”

另见:

这表明这个进程实际上消耗了21G的物理内存

对。“top”命令报告操作系统提供的进程物理内存使用情况。没有理由不相信它

对于“顶部”显示的21G,是否有任何逻辑解释

它可能是大量的堆外内存分配,或者是一个大的内存映射文件,或者。。。大量线程堆栈

或者潜在的其他事情

请注意,
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 ... ... ...