如果我的机器上有16 GB的RAM,我可以分配给我正在执行的java命令行程序多少?我认为java -Xmx 16g...
会使我的系统崩溃吗?
修改
根据评论,我尝试了java -Xmx16g...
,并没有让我的机器崩溃。该程序仍然耗尽内存。我试过了java -Xmx32g...
,这让我的机器崩溃了。
从下面的评论(这真的很有启发性),我想我只需要继续玩分配。
答案 0 :(得分:7)
虚拟机堆内存的大小由选项 - Xms 控制 和 - Xmx 。
第一个指定初始堆大小和第二个最大大小。
分配在 JVM本身内完成,而不是在操作系统上完成。由于需要更多内存,JVM会分配一块内存,直到达到Xmx。
如果您需要更多,则会抛出OutOfMemoryError。
对于 Xms 和 Xmx 使用相同的值是很常见的, 导致VM仅在执行开始时在操作系统中分配内存, 不依赖于操作系统特定行为。
在您的情况下,由于您将32g设置为Xmx并且系统崩溃,因此您似乎没有此内存(交换+内存ram)
如果手动更改系统的虚拟内存容量,配置将起作用。
答案 1 :(得分:2)
这个关于maximum heap size的链接对您有用。
这取决于您的操作系统。
答案 2 :(得分:0)
您的操作系统无法分配超过16GB的内存,因此系统崩溃。除了另一个答案中陈述的XMX和XMS之外,还有一个-XX:+ AggressiveHeap选项,用于检查机器资源(内存大小和处理器数量),并尝试将各种参数设置为长时间运行的最佳内存分配密集型工作