Java进程内存使用量远远超过Runtime.totalMemory等方法所说的

时间:2012-04-26 08:14:05

标签: java memory-management embedded

我一直坚持这个问题很久没有任何暗示。如果有人可以提供帮助,我们将非常感激。

我正在使用ARM v7处理器在设备上运行Java应用程序。它上面安装了Ubuntu。使用“top”或“free -m”命令看到的进程的内存使用量大约为180 MB,远远超过Runtime.freeMemory等方法告诉我的内容。

这就是我开始申请的方式:

  

java -Xcheck:jni -XX:MaxPermSize = 25m -Xmx65m   -XX:ReservedCodeCacheSize = 10m -jar MyAPP.jar myconfig.xml

据我了解,此进程的总内存使用量不应超过25 + 65 + 10 = 100 MB。它可能会更多(我不知道的其他非堆空间)。但即便如此,我也不认为差异应该是这么多(80 MB)。

这就是“运行时”命令似乎在我的日志中告诉我的内容(我使用这些命令在我的调试日志中打印使用信息)。

使用信息:Avaialable处理器:2个可用于JVM的可用内存:8474344,当前内存使用量:5943576,允许使用的最大内存JVM:66977792

“top”的输出:

PID   USER     PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3926  linaro   20  0   266m  188m 3636 S  1.0 21.1   0:37.81 java

“free -m”的输出:

Java进程运行时:

        total       used       free     shared    buffers     cached
Mem:     893         842         51          0         40        216
-/+ buffers/cache:   585        308
Swap:     0          0          0

当进程停止时:

         total      used       free     shared    buffers     cached
Mem:      893        656        237          0         40        216
-/+ buffers/cache:   400        493
Swap:      0          0          0

正如我们所看到的,493 - 308 = 185,匹配“top”对此进程的内存使用情况的评价(之前我认为可能在此计算机上安装了顶级错误)。

我也对这个进程进行了远程监控,它显示了大约14M的“已提交”堆空间和大约20M的非堆。至少堆空间与我从“运行时”命令获得的空间相匹配。因此,即使远程监控工具似乎也说内存使用量远低于180M。

最奇怪的是,当我在笔记本电脑(MacBook Pro)或标准的基于英特尔的Linux机箱(不是ARM)上运行时,同样的罐子似乎到位。进程只使用大约60 MB的空间,这是我所期望的。

值得一提的另一点是我在ARM设备上使用的Java VM是Oracle的Java SE Embedded版本。

任何知道这种内存使用差异的人。很抱歉提出这么长的问题: - )。

更新:

在对可以消耗内存的Java进程的各个部分进行一些研究之后,我将本机代码交互(JNI)归为一类。这是唯一一个我们无法通过命令实时参数限制内存消耗的人。在我的程序中,我使用sqlite-jdbc驱动程序来访问数据库。我评论了数据库访问部分和内存使用量降至24MB! 所以我猜这个内存差异与这个sqlite jdbc访问有关,虽然还不确定它是什么。随着我取得一些进展,我会继续更新。

-Sandeep

1 个答案:

答案 0 :(得分:1)

您观察到的是JVM与进程内存之间的区别。

看看这些答案:

Process Memory Vs Heap -- JVM

JVM Process vs JVM Heap memory usage

由于您在每个系统上使用不同的JVM实现,因此可能会有不同的内存行为。