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

Ali*_*Ali 7 java memory garbage-collection jvm heap-memory

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

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

谢谢

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

Pet*_*rey 6

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

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

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

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

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

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

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

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

它已经如我所说的那样,允许它使用太多内存并不是一个好主意.