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



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

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

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

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

两个注意事项:

  • 如果提交的大小不适合物理内存,则部分大小将交换到页面文件。这会导致GC过程中的速度大幅放缓,在这种情况下,您将通过减少堆大小来提高应用程序的性能
  • 有些操作系统允许双重预订内存-只要你不尝试使用,你可以随心所欲地分配内存(忘记是哪个操作系统了-有人告诉我)

"这是否意味着jvm进程正在使用内存,而其他进程不可用"应该是正确的。因此,它小于(或等于)操作系统认为JVM进程占用的内存量。

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

相关内容