为什么Java中有最大堆设置?

3
在阅读完Java字符串可以有多少个字符之后,我开始思考:
为什么现在的JVM中有最大堆设置?当堆内存用尽且垃圾收集器无法释放所需内存时,为什么不直接向操作系统请求更多内存呢?有人知道这背后的原理吗?
7个回答

3

我认为这有助于沙盒化Java程序,即防止它们占用物理机器上的所有内存。此外,即使进行垃圾回收,在Java中仍然可能发生内存泄漏,有时甚至比C / C ++更微妙。

如果您真的需要更大的内存配额来运行Java软件,可以在配置文件中调整最大虚拟机大小。


Java可以在Web浏览器内运行,而您不希望被沙盒化的Java接管系统。因此,我认为这是做出决定的最有可能的原因。大多数其他描述的情况也可以通过更智能的垃圾收集器来解决。 - Martin

2

因为您不希望JVM占用操作系统上的所有可能资源(尽管在某些情况下,您希望这样做,但在这种情况下,请将最大堆大小设置为JVM和操作系统组合可以处理的最大值)。


2

JVM是虚拟机。当您创建虚拟机时,由于通常希望在实际机器上运行多个虚拟机,因此会限制其资源。


1

因为堆内存过多实际上可能会产生负面影响——你可能会遇到这样一种情况:一个相对较小的应用程序使用了大堆中的所有内存,因此当GC运行时,它会在回收大量内存时使你的应用程序停顿。

较小的堆将允许gc更频繁地运行,但不会每次都瘫痪您的程序。


但建议在GC已经运行后才请求新内存。另外:为什么GC只有在内存不足时才运行?当系统处于空闲状态时运行GC不是更好吗?特别是当您使用移动收集器时。在某些操作系统中,移动收集器甚至可以将释放的内存返回给操作系统。 - Martin

1

因为物理内存也是有限的。你不能一直请求更多。实际上,即使物理RAM不可用,操作系统也会分配虚拟内存。内存将被分配在磁盘上,这可能会导致严重的性能问题。在最坏的情况下,整个计算机会卡住,你无法对其进行任何操作。最好早点失败,即JVM崩溃要比物理主机卡住要好。


1

两个问题:

  1. 你不希望消耗掉所有的资源
  2. 如果堆大小过高,会导致垃圾回收器出现问题,因为你的程序可能会意外暂停几分钟,因为GC必须完成它的工作

问题2足够大,适用于为大型Java进程分配数百GB的情况,甚至已经开发了像Terracotta's bigmemory这样的备选解决方案。


0
也许您不希望整个内存只被一个应用程序使用。 请注意,如果仍有一些空闲内存,则可能不会释放内存,这意味着,如果您的应用程序在Xmx200m上完美运行,并在没有最大堆限制的情况下运行它,它可能会占用整个内存。

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