gpt4 book ai didi

java - 为什么Java不支持自动堆扩容?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:02:13 24 4
gpt4 key购买 nike

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

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

谢谢

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

最佳答案

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

Why Java does not expand the heap size until it hits the OS-imposed process memory limit, in the same way .NET CLR does?

如果您将最大堆大小设置得足够大,或者使用堆外内存,它就会。默认情况下它不会这样做。一个原因是堆内存必须在主内存中,并且不能在不破坏机器性能的情况下换出(如果不破坏你的机器)C 程序不是这样,扩展太多比扩展失败更糟糕。

如果您的 JVM 的堆大小比主内存多 10%,并且您使用了那么多,一旦您执行 GC,它必须多次接触每个页面,您可能会发现您需要重启盒子。

当资源耗尽时,Linux 有一个进程 killer ,这不会触发你可能幸运地重新启动。

Is it just a policy made by JVM developers, or is an advantage of .NET CLR's architecture over JVM's one

JVM 的一个关键特性是它是独立于平台的,因此它有自己的控制权。在您的进程空间限制下运行的 JVM 可能会阻止您的机器工作(由于大量交换)我不知道 .NET 是否可以避免这种情况的发生。

In other words, if Oracle engineers want to implement automatic heap expansion for the JVM, are they able to do that?

正如我所说,它已经这样做了,让它使用太多内存并不是一个好主意。

关于java - 为什么Java不支持自动堆扩容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com