有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Linux RES上的Java内存管理vs totalMemory()

我有一个Java应用程序在Linux上运行,Xmx设置为1200M

当我在顶部检查流程时,我看到如下数字: VIRT=1412m RES=237m SHR=58m

在Java应用程序内部,我正在打印运行时。getRuntime()。totalMemory()每分钟一次,其中的数字显示:

totalMemory()=108M

为什么RES和totalMemory()的值之间存在如此大的差异

我的理解(这可能是错误的)——totalMemory()是当前堆中使用的内存。RES——进程使用的实际RAM内存

作为更新: 是的,我希望RES>;totalMemory()-但这里的差异是237MB-108MB=129MB。所以,如果有人问我,我的Java应用程序可以使用的最大内存是多少,应该是1200MB+“某物”-问题是如何知道“某物”。。是150MB吗?200MB?300兆


共 (2) 个答案

  1. # 1 楼答案

    totalMemory只是一个最大堆大小,Java进程包含Java堆和其他东西,例如永久区域,所以RES的大小总是比Java堆大

  2. # 2 楼答案

    RES可能会包括JVM加载的共享库的大小,其中许多库也可能为其他应用程序(例如C运行时库)加载,因此实际上并不计入JVM的实际内存使用量,而是被视为其驻留内存映像的一部分

    pstop结果的实际解释可能更好地指向超级用户。组织或服务器故障。组织