我能分配多少内存?

5
如果我的计算机上有16 GB的RAM,我可以分配多少给正在执行的Java命令行程序?我假设使用“java -Xmx 16g…”会导致系统崩溃吗?
编辑: 鉴于评论,我尝试了“java -Xmx16g …”,它没有使我的计算机崩溃。程序仍然会因为内存不足而停止运行。我尝试了“java -Xmx32g…”,这确实导致了系统崩溃。
根据下面的评论(这些评论真的很有启发性),我想我只需要继续尝试不同的分配方式。

3
你尝试的时候发生了什么? - Kevin Workman
1
试一试就知道了。操作系统提供交换空间,使得可用的虚拟内存总量比实际物理内存容量更大,只要不是所有内存同时需要(页面可以被“交换出去”)。 - TypeIA
5
@RC: 为什么不行?你还相信640kB足够吗? (说明:此处是在讨论计算机存储容量是否足够的问题,对历史背景有一定了解的人可能会知道这是比尔·盖茨曾经说过的一句话。) - njzk2
@RC. - 我知道这有点过头了。但是我需要处理大量数据,而且并不总是能够访问学校的服务器。编辑:我已经攒了一年多的钱,由于苹果一直推迟2013年MBP的发布日期,所以我一直在攒更多的钱... :-) - Adam_G
2
@njzk2 嘿,我曾经用一台只有56KB RAM的Apple II+编程!我还曾经走过五英里上学,而且来回都是上坡路... - ajb
显示剩余3条评论
2个回答

8
虚拟机的堆内存大小由选项- Xms- Xmx控制。
第一个指定初始堆大小,第二个指定最大堆大小。
分配是在JVM内部完成的,而不是在操作系统上完成的。随着需要更多内存,JVM将分配一块内存直到达到Xmx。
如果需要更多内存,则会抛出OutOfMemoryError异常。
通常使用相同的值用于XmsXmx,这会导致VM仅在执行开始时在操作系统中分配内存,而不依赖于操作系统特定行为
在您的情况下,由于您将32g设置为Xmx并且系统崩溃了,似乎您没有这个内存(交换+ RAM内存) 如果手动更改系统的虚拟内存大小,则配置将起作用。

1

你的操作系统无法分配超过16GB的内存,因此系统会崩溃。除了另一个答案中提到的XMX和XMS之外,还有一个-XX:+AggressiveHeap选项,该选项检查机器资源(内存大小和处理器数量),并尝试设置各种参数以使长时间运行的、内存分配密集型的作业达到最佳状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接