在阅读完Java字符串可以有多少个字符之后,我开始思考:
为什么现在的JVM中有最大堆设置?当堆内存用尽且垃圾收集器无法释放所需内存时,为什么不直接向操作系统请求更多内存呢?有人知道这背后的原理吗?
为什么现在的JVM中有最大堆设置?当堆内存用尽且垃圾收集器无法释放所需内存时,为什么不直接向操作系统请求更多内存呢?有人知道这背后的原理吗?
我认为这有助于沙盒化Java程序,即防止它们占用物理机器上的所有内存。此外,即使进行垃圾回收,在Java中仍然可能发生内存泄漏,有时甚至比C / C ++更微妙。
如果您真的需要更大的内存配额来运行Java软件,可以在配置文件中调整最大虚拟机大小。
因为您不希望JVM占用操作系统上的所有可能资源(尽管在某些情况下,您希望这样做,但在这种情况下,请将最大堆大小设置为JVM和操作系统组合可以处理的最大值)。
JVM是虚拟机。当您创建虚拟机时,由于通常希望在实际机器上运行多个虚拟机,因此会限制其资源。
因为堆内存过多实际上可能会产生负面影响——你可能会遇到这样一种情况:一个相对较小的应用程序使用了大堆中的所有内存,因此当GC运行时,它会在回收大量内存时使你的应用程序停顿。
较小的堆将允许gc更频繁地运行,但不会每次都瘫痪您的程序。
因为物理内存也是有限的。你不能一直请求更多。实际上,即使物理RAM不可用,操作系统也会分配虚拟内存。内存将被分配在磁盘上,这可能会导致严重的性能问题。在最坏的情况下,整个计算机会卡住,你无法对其进行任何操作。最好早点失败,即JVM崩溃要比物理主机卡住要好。
两个问题:
问题2足够大,适用于为大型Java进程分配数百GB的情况,甚至已经开发了像Terracotta's bigmemory这样的备选解决方案。