在接受采访时被问到.如果指定的最大堆大小(Xmx)大于可用RAM,会发生什么?我还想知道如果指定最小堆大小(Xms)大于可用RAM会发生什么?
Jay*_*ren 12
找出答案的最简单方法是尝试并查看.
编辑: 问题实际上至少有两个答案.可能在64位系统上,如前所述,您的应用程序可能会在内存使用量增长和增长并开始颠簸.在32位系统上,故事有点不同,因为操作系统无法为您提供那么多堆空间.例如,如果我使用命令行选项-Xmx2000m在Windows XP上运行带有32位java的应用程序,它将会消失,其消息类似于以下内容:
无效的最大堆大小:-Xmx2000m
指定的大小超出了最大可表示大小.
无法创建Java虚拟机.
在使用32位java的Linux中,我使用-Xmx3000m得到以下内容:
无法创建Java虚拟机.
VM初始化期间发生错误
无法为对象堆保留足够的空间
在使用32位java的Linux中,我使用-Xmx6000m获得以下内容
无效的最大堆大小:-Xmx6000m
指定的大小超出了最大可表示大小.
无法创建Java虚拟机.
尝试使用64位Java,JVM确实允许您分配比物理RAM更多的内存,但是如果要求大量内存,jvm将再次失败并出现错误.
Ste*_*rCS 12
只有当您的-Xms(最小值)大于可用内存时,您才会在 JVM 初始化时立即失败
$>java -Xms100g #JVM fails to start
Error occurred during initialization of VM Could not
reserve enough space for object heap
Run Code Online (Sandbox Code Playgroud)
如果您的 - Xmx(最大值)大于可用内存,则您的 JVM 会初始化,因为您尚未使用内存
$>java -Xmx100g #JVM starts up fine
Usage: java [-options] class [args...]
...
Run Code Online (Sandbox Code Playgroud)
如果您的 -Xmx(最大值)大于可用内存(包括任何虚拟内存的总内存),当且仅当您的 JVM 进程实际尝试使用比机器更多的内存时,您才会遇到运行时故障。
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5feb100000, 927465472, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 927465472 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /some/file/path/hs_err_pid25.log
Run Code Online (Sandbox Code Playgroud)
在接近您的 -Xmx 限制之前它不会“颠簸”,但是如果该限制高于您的可用内存,您将收到上述内存分配错误,并且您的程序将在甚至考虑颠簸之前终止。(这是非常戏剧性的!)
| 归档时间: |
|
| 查看次数: |
17302 次 |
| 最近记录: |