Java 中已提交内存的确切状态

2022-09-04 07:43:42

我很好奇当从MemoryUsage类中查询值时,“提交”内存的确切含义是什么。该类将其解释为“提交表示保证可供Java虚拟机使用的内存量(以字节为单位)。这是否意味着内存正由 jvm 进程使用,并且在 java 进程释放内存之前不可用于其他进程,还是意味着如果 java 进程尝试分配到该内存量,它将成功?我意识到这可能是特定于实现的,但我只对热点感兴趣。


答案 1

提交的大小是实际分配的内存,使用的大小是用于存储实际数据的大小(当使用~=提交时,是时候进行主要GC并可能增加堆了)。最大大小是堆可以增长到的硬限制 - 如果还不够,JVM 会抛出 OutOfMemoryError。

如果提交了内存,那么它绝对可以使用。此外,JVM无法提交更多内存的唯一情况(在现代操作系统上)是硬件虚拟内存不足的情况。

所有这些大小仅告诉您堆区域的大小。JVM 还有其他内存区域(线程堆栈、JIT 缓存等)。堆区域通常最大,这大致对应于进程占用空间。

两点注意事项:

  • 如果提交的大小不适合物理内存,则部分大小将交换到页面文件中。这会导致 GC 期间大幅减速,在这种情况下,您将通过减小堆大小来提高应用性能。
  • 一些操作系统允许双重预订内存 - 只要你不尝试使用它,您就可以分配尽可能多的内存(忘记了它是哪个操作系统 - 有人填写我)

答案 2

“这是否意味着内存正由 jvm 进程使用,而不能用于其他进程”,这是正确的一个。因此,它小于(或等于)操作系统认为由JVM进程占用的内存量。

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html(抱歉没有锚点可以链接到)。