java中提交内存的确切状态

java中提交内存的确切状态,java,memory,jvm-hotspot,Java,Memory,Jvm Hotspot,我很好奇,当从MemoryUsage类查询值时,“提交的”内存的确切含义是什么。该类将其解释为“committed表示保证可供Java虚拟机使用的内存量(以字节为单位)。”这是否意味着jvm进程正在使用该内存,而在Java进程释放该内存之前,其他进程无法使用该内存,或者,如果java进程尝试分配到该内存量,是否意味着它将成功?我意识到这可能是特定于实现的,但我只对热点感兴趣。“这是否意味着jvm进程正在使用内存,而其他进程无法使用内存”才是正确的答案。因此,它小于(或等于)操作系统认为JVM进程

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

“这是否意味着jvm进程正在使用内存,而其他进程无法使用内存”才是正确的答案。因此,它小于(或等于)操作系统认为JVM进程占用的内存量


(抱歉,没有链接到的锚)

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

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

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

注二:

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

至少Linux可以进行双重预订;这叫做“过度承诺”。“提交的大小是实际分配的内存,使用的大小是用于存储实际数据的大小(当使用~=committed时,它是主要GC的时间,可能是堆增长的时间)。最大大小是堆增长的硬限制-如果不够,JVM抛出OutOfMemoryError。”对我来说,这意味着(这取决于堆的最大值,-Xmx)您将得到OutOfMemoryError吗?