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