我在Linux上运行Java应用程序,Xmx设置为1200M
当我在TOP中检查过程时,我看到的数字如下: VIRT = 1412米 RES = 237米 SHR = 58m
在Java应用程序中,我每分钟打印Runtime.getRuntime()。totalMemory()并显示其中的数字:
totalMemory()= 108M
为什么RES和totalMemory()的值之间有这么大的差异?
我的理解(可能是错误的) - totalMemory()是现在在堆中使用的内存。 RES - 进程使用的实际RAM内存。
作为更新: 是的,我希望RES> totalMemory() - 但这里的差异是237MB - 108MB = 129MB。所以,如果有人问我,我的Java应用程序可以使用的最大内存是多少,它应该是1200MB +“东西” - 问题是如何知道“某些东西”......它是150MB吗? 200MB? 300MB?
答案 0 :(得分:0)
RES可能包含JVM加载的共享库的大小,其中许多也可能被其他应用程序(例如C运行时库)加载,因此实际上并没有计入实际的内存使用量。 JVM,但被认为是其常驻内存映像的一部分。
ps
或top
的结果的实际解释可能更好地针对superuser.org或serverfault.org。
答案 1 :(得分:0)
totalMemory只是一个Max堆大小,Java进程包含Java堆和其他东西,例如,永久区域,因此RES的大小总是比java堆的大。