Ali*_*Ali 7 java memory garbage-collection jvm heap-memory
为什么Java不会扩展堆大小,直到它达到操作系统强加的进程内存限制,就像.NET CLR一样?
它只是JVM开发人员制定的策略,还是.NET CLR体系结构优于JVM的优势?换句话说,如果Oracle工程师想要为JVM实现自动堆扩展,他们能够做到吗?
谢谢
编辑:我真的认为这是一个糟糕的java设计选择.将Xmx设置得尽可能高是不安全的(例如100 GB!).如果用户需要在更大的数据上运行我的代码,他可以在具有更多可用RAM的系统上运行它.作为开发人员,我为什么要设置程序的最大可用内存?我不知道数据的大小!
当JVM需要达到您设置的最大堆大小时,JVM会增加堆大小.它不占用所有内存,因为它必须在启动时预先分配它,你可能想要一些内存用于其他东西,如线程堆栈,共享库,堆内存等.
为什么Java不会扩展堆大小,直到它达到操作系统强加的进程内存限制,就像.NET CLR一样?
如果将最大堆大小设置得足够大,或者使用关闭堆内存,则会.默认情况下它不会这样做.一个原因是堆内存必须在主内存中,并且不能在不破坏机器性能的情况下进行交换(如果不是杀死你的机器).对于C程序来说这是不正确的,并且扩展太多比未能扩展更糟糕.
如果你的JVM堆大小比主内存大10%并且你使用那么多,那么只要你执行一个不止一次触及每个页面的GC,你很可能会发现你需要重启电源盒子.
当资源耗尽时,Linux有一个进程杀手,这并不会触发你可能有足够的运气重启.
它只是JVM开发人员制定的策略,还是.NET CLR体系结构优于JVM的优势
JVM的一个关键特性是它与平台无关,因此它有自己的控件.运行在进程空间极限的JVM可能会阻止您的计算机工作(从大量交换)我不知道.NET可以避免这种情况发生.
换句话说,如果Oracle工程师想要为JVM实现自动堆扩展,他们能够做到吗?
它已经如我所说的那样,允许它使用太多内存并不是一个好主意.
| 归档时间: |
|
| 查看次数: |
2319 次 |
| 最近记录: |