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

时间:2008-10-15 22:59:03

标签: java memory jvm-hotspot

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

2 个答案:

答案 0 :(得分:21)

提交的大小是实际分配的内存,使用的大小是用于存储实际数据的大小(使用时〜=已提交主要GC的时间并可能增加堆)。最大大小是堆可以增长的硬限制 - 如果它不够,则JVM会抛出OutOfMemoryError。

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

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

两个注释:

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

答案 1 :(得分:2)

“这是否意味着jvm进程正在使用内存而其他进程无法使用”将是正确的。因此它少于(或等于)操作系统看到的JVM进程所占用的内存量。

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