我很好奇从 MemoryUsage 类中查询值时“已提交”内存的确切含义是什么。该类将其解释为“已提交表示保证可供 Java 虚拟机使用的内存量(以字节为单位)。” 这是否意味着该内存正在被 jvm 进程使用,并且在它被 java 进程释放之前不可用于其他进程,还是意味着如果 java 进程尝试分配最多该内存量,它将成功? 我意识到这可能是特定于实现的,但我只对热点感兴趣。
Spencer Stejskal
问问题
15602 次
2 回答
24
提交的大小是实际分配的内存,使用的大小是用于存储实际数据的大小(当使用 ~= 提交时,是主要 GC 的时间并可能增加堆)。最大大小是堆可以增长的硬限制——如果不够,JVM 会抛出 OutOfMemoryError。
如果内存被提交,那么它肯定可以使用。此外,JVM 无法提交更多内存(在现代操作系统上)的唯一情况是硬件虚拟内存不足。
所有这些大小仅告诉您堆区域的大小。JVM 也有其他内存区域(线程堆栈、JIT 缓存等)。堆区域通常是最大的,这大致对应于进程占用空间。
两个注意事项:
- 如果提交的大小不适合物理内存,它的一部分将被交换到页面文件。这会导致 GC 期间的速度大幅下降,在这种情况下,您将通过减小堆大小来提高应用程序的性能。
- 一些操作系统允许双重预订内存 - 只要你不尝试使用它,你就可以分配尽可能多的内存(忘记它是哪个操作系统 - 有人填写我)
于 2008-10-15T23:31:21.253 回答
2
“这是否意味着内存正在被 jvm 进程使用而其他进程不可用”将是正确的。所以它小于(或等于)操作系统看到的 JVM 进程占用的内存量。
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html(抱歉没有锚链接到)。
于 2008-10-15T23:16:26.260 回答