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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/206847/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 11:25:27  来源:igfitidea点击:

Exact state of committed memory in java

javamemoryjvm-hotspot

提问by Spencer Stejskal

Im curious what the exact meaning of "committed" memory is when the value is queried from the MemoryUsage class. That class explains it as "committed represents the amount of memory (in bytes) that is guaranteed to be available for use by the Java virtual machine." Does this mean that the memory is in use by the jvm process and NOT available to other processes until it is released by the java process, or does it mean that the java process will be successful if it tries to allocate up to that amount of memory? I realize this might be implementation specific but i am only interested in hotspot.

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

回答by ddimitrov

The committed size is the actually allocated memory, the used size is the size used for storing actual data (when used ~= committed it's time for major GC and possibly growing the heap). The Max size is the hard limit to which the heap can grow - if it's not enough the JVM throws OutOfMemoryError.

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

If a memory is committed then it definitely can be used. Also, the only occasion when JVM would not be able to commit more memory (on a modern OS) is if the hardware is out of virtual memory.

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

All these sizes only tell you the size of the heap region. The JVM has other memory regions as well (thread stacks, JIT cache, etc.) The heap region is usually largest, this roughly corresponds to the process footprint.

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

Two notes:

两个注意事项:

  • if the committed size does not fit in the physical memory, parts of it will be swapped to the page file. This leads to big slowdown during GC and in such cases you will improve the app performance by reducing the heap size.
  • some operating systems allow double booking of memory - you can allocate as much as you want as long as you don't try to use it (forgot which OS it was - somebody fill me in)
  • 如果提交的大小不适合物理内存,它的一部分将被交换到页面文件。这会导致 GC 期间大幅减慢,在这种情况下,您将通过减少堆大小来提高应用程序性能。
  • 某些操作系统允许双重预订内存 - 只要您不尝试使用它,您就可以分配任意数量的内存(忘记它是哪个操作系统 - 有人填写)

回答by Michael Neale

"Does this mean that the memory is in use by the jvm process and NOT available to other processes" would be the correct one. So its less then (or equal to) the amount of memory the OS sees as taken by the JVM process.

“这是否意味着内存正在被 jvm 进程使用并且不可用于其他进程”将是正确的。因此,它小于(或等于)操作系统看到的 JVM 进程占用的内存量。

http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html(sorry no anchors to link to).

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