为什么Java不支持自动堆扩展?

时间:2013-09-12 10:49:06

标签: java memory garbage-collection jvm heap-memory

为什么Java不会扩展堆大小,直到达到操作系统强加的进程内存限制,就像.NET CLR一样?

它只是JVM开发人员制定的策略,还是.NET CLR体系结构优于JVM的优势?换句话说,如果Oracle工程师想要为JVM实现自动堆扩展,他们能够做到吗?

由于

编辑:我认为这对java来说是一个糟糕的设计选择。将Xmx设置得尽可能高是不安全的(例如100 GB!)。如果用户需要在更大的数据上运行我的代码,他可以在具有更多可用RAM的系统上运行它。作为开发人员,我为什么要设置程序的最大可用内存?我不知道数据的大小是什么!!!

2 个答案:

答案 0 :(得分:6)

当JVM需要达到您设置的最大堆大小时,它会增加堆大小。它不占用所有内存,因为它必须在启动时预先分配它,你可能想要使用一些内存用于其他东西,如线程堆栈,共享库,堆内存等。

  

为什么Java在达到操作系统强加的进程内存限制之前不会扩展堆大小,就像.NET CLR一样?

如果将最大堆大小设置得足够大,或者使用关闭堆内存,它将会。默认情况下它不会这样做。一个原因是堆内存必须在主内存中,并且不能在不破坏机器性能的情况下进行换出(如果不是杀死你的机器)。对于C程序来说,这是不正确的,扩展太多比没有扩展更糟糕。< / p>

如果你的JVM堆大小比主内存大10%并且你使用了那么多,那么只要你执行一个不止一次触及每个页面的GC,你很可能会发现你需要打开电源盒。

当资源耗尽时,Linux有一个进程杀手,这不会触发你可能有足够的运气重启。

  

它只是JVM开发人员制定的策略,还是.NET CLR体系结构优于JVM的优势

JVM的一个关键特性是它与平台无关,因此它有自己的控件。运行在进程空间极限的JVM可能会阻止您的计算机工作(从大量交换)我不知道.NET可以避免这种情况发生。

  

换句话说,如果Oracle工程师想要为JVM实现自动堆扩展,他们能够做到吗?

我已经说过,允许它使用太多内存并不是一个好主意。

答案 1 :(得分:3)

开发人员决定决定java进程必须允许多少堆内存。它基于各种因素,如项目设计,运行平台等。

我们可以设置堆大小属性

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

正如您所看到的,我们设置了初始堆大小,如果以后JVM发现需要更多,那么它可以将堆大小增加到最大指定限制。事实上,当我们做GC(不是授权)时,大小会发生变化。我以类似的理由发布了question。你可以参考它。因此,堆大小的增加/减少是由JVM完成的。我们所要做的就是开发人员根据我们的要求指定限制。