![](/img/trans.png)
[英]Java: on the cost of calling Runtime.freeMemory(), Runtime.totalMemory() and Runtime.maxMemory()
[英]Java process memory usage much more than what Runtime.totalMemory et al methods are telling
我一直坚持这个问题很久没有任何暗示。 如果有人能提供帮助,我们真的很感
我正在使用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
“顶部”输出:
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,匹配“顶级”关于此进程的内存使用情况的说法(之前我认为可能在此计算机上安装了顶级错误)。
我也对这个进程进行了远程监控,它显示了大约14M的“已提交”堆空间和大约20M的非堆。 至少堆空间与我从“运行时”命令获得的空间相匹配。 因此,即使远程监控工具似乎也说内存使用量远低于180M。
最奇怪的部分是,当我在笔记本电脑(MacBook Pro)或基于标准Intel的Linux机箱(不是ARM)上运行时,同样的罐子似乎到位。 进程只使用大约60 MB的空间,这是我所期望的。
值得一提的另一点是我在ARM设备上使用的Java VM是Oracle的Java SE Embedded版本。
任何人都知道这种内存使用上的差异。 很抱歉问这么长的问题:-)。
更新:
在对可以消耗内存的Java进程的各个部分进行一些研究之后,我将本机代码交互(JNI)归结为一体。 这是唯一一个我们无法通过命令实时参数限制内存消耗的人。 在我的程序中,我使用sqlite-jdbc驱动程序来访问数据库。 我评论了数据库访问部分和内存使用量降至24MB! 所以我猜这个内存差异与这个sqlite jdbc访问有关,虽然还不确定它是什么。 随着我取得一些进展,将继续更新。
-Sandeep
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.