假设 JVM 堆的最大大小为 2GB(-Xmx2048m -Xms100m),我们发现该堆的使用峰值为 1GB,完成后的峰值提交使用量为 1.2GB。所以,我的问题是在 JVM 运行时,其他应用程序是否可以使用可用空间(2GB - 1.2GB)。
我认为可用空间不能被其他人使用,但我目前不确定:操作系统在 JVM 运行之前保留 2GB 可用空间。保留的空间可能不会被其他应用程序消耗,尽管 JVM 无法使用它。
JVM 检查 OS 是否有足够的地址空间用于 -Xmx,但 OS 不会实际分配内存,直到 JVM 请求那么多。JVM 将仅保留 -Xms 内存,但如果有足够的内存可用,则可以扩展到 -Xmx。
Runtime.getRuntime().totalMemory()
将返回堆的当前大小,不会超过命令行中指定的最大大小。
这大约是操作系统分配给 JVM 的内存量(不包括非堆 JVM 内存)。其他内存可供其他应用程序免费使用。
当然,这被严重简化了——总系统内存是总物理内存 + 总可用交换,还有其他复杂性(例如,Linux 承诺为进程提供内存,但实际上并没有将其提交给该进程,除非它被触及,也简化了) . 无论如何,简短的回答是:是的,您在命令行上指定了最大大小,但当前大小是分配给 JVM 的;其余的可用于其他应用程序。
Java进程看到的内存是虚拟内存。操作系统并不需要真正为 Java 进程预留 2GB 空闲物理内存。