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

时间:2010-12-08 09:34:31

标签: java garbage-collection

阅读How many characters can a Java String have?后,我开始怀疑:

为什么当前JVM中存在最大堆设置?当堆内存耗尽且垃圾收集器无法释放所需内存时,为什么不从操作系统请求更多内存?有人知道背后的理由吗?

7 个答案:

答案 0 :(得分:3)

我相信它有助于沙盒Java程序,即阻止它们占用物理机器上的所有内存。即使使用垃圾收集,内存泄漏仍然可以在Java中发生,并且它们有时甚至比在C / C ++中更加微妙。

如果您确实需要为Java软件提供更大的内存容量,则可以在配置文件中调整最大VM大小。

答案 1 :(得分:2)

因为您不希望JVM接管O / S上的所有可能资源(在某些情况下,您可以这样做,但在这种情况下,将Max Heap大小设置为JVM的最大值,O / S组合可以处理)。

答案 2 :(得分:2)

JVM是一个虚拟机。创建虚拟机时,会限制其资源,因为通常您需要在实际计算机上安装多个虚拟机。

答案 3 :(得分:1)

因为太多的堆内存实际上可能是有害的 - 你可能会遇到一个相对较小的应用程序使用所有大堆的情况,这样当GC启​​动时它会让你的应用程序在收回大量内存时停止运行。

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

答案 4 :(得分:1)

因为物理内存也是有限的。你不能要求越来越多。实际上,即使物理RAM不可用,您也可以分配虚拟内存。内存将分配在磁盘上,可能会导致严重的性能问题。在更糟糕的情况下,整个计算机卡住了,你无法用它做任何事情。最好早点失败,即JVM崩溃比物理主机卡住更好。

答案 5 :(得分:1)

两件事:

  1. 您不希望消耗所有资源
  2. 过大的堆大小会导致垃圾收集器出现问题,因为您的程序可能会意外暂停几分钟,因为GC必须完成它的工作
  3. 问题2.足够大,适用于为大型Java流程分配数百GB的情况,甚至还开发了Terracotta's bigmemory等替代解决方案。

答案 6 :(得分:0)

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