为什么最大的JVM堆大小不能接近或达到计算机的最大物理内存?

7
我有一台64位机器,理论上地址空间为2^64字节,物理内存为32G。
这是一台具有16个核心的服务器级别的机器,是一台生产服务器。
由于没有其他运行大量内存的进程,而且服务器JVM是唯一运行的应用程序,是否有任何理由不将JVM堆设置为非常大的数字?
我看到它被设置为少于10GB,我想不出任何解释。
正如我在帖子中提到的那样: 我了解内核、缓存和其他进程需要共享RAM。但除了任何其他进程和操作系统本地内容之外,没有其他事情发生。 这台机器是一台生产机器,专门用于这个特定的JVM。
除了需要快速失败之外,似乎没有任何理由不将其设置为20GB/32GB(物理内存)?
从下面的评论中可以看出——似乎没有...除了需要快速失败,感谢您的回复。

1
根据我的经验,一台物理机器上通常会有不止一个JVM,至少对于普通用户而言是这样的。而且大多数用户并不需要超过1-2GB的内存。因此,我不会感到惊讶,这可能导致了您观察到的默认值。 - C4stor
4
补充C4stor的评论:如果您的应用程序需要更多RAM,则将数字增加。人们通常会降低它,因为应用程序只会在某种“失控”状态下使用大量RAM,并且他们希望它尽早失败,而不是占用RAM并在后来失败。 - tmyklebu
在你的特定情况下,假设是有效的,更重要的是仍然有效,你可以选择提高限制。在大多数其他情况下,人们会问谁设置了 VM 的大小并使用了所有的内存。 - Tony Hopkinson
另外,通常还会有一些JVM本身以外的东西在运行。所以在64位机器上有32G是完全可以的,这在现今的开发工作站上很普遍。JVM需要与桌面环境、IDE、Web浏览器、可能还有数据库共享资源...最好不要假定它拥有整个机器,并让用户指定是否使用。此外,一些系统(如Neo4J)在JVM堆之外使用大量RAM。 - chrylis -cautiouslyoptimistic-
JVM本身需要物理内存进行记账,因此您不能将所有RAM都分配给Java堆,您必须至少为JVM留一些空间。 - Victor Sorokin
因为有时候还有其他事情要做?此外,随着堆变得越来越大,性能有时会下降,因为GC必须管理更多的对象。通常存在一个“甜点”,超过这个点增加堆对程序没有好处,反而可能会有害。 - Hot Licks
1个回答

1
因为操作系统也需要RAM,用于缓存、缓冲区、守护进程(如syslogd)、页表、内核数据结构等。
此外,JVM设计者不知道您在JVM启动后可能想启动哪些其他应用程序。因此,默认情况下JVM不会独占所有RAM是明智的选择。

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