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

标签 java memory garbage-collection jvm heap-memory

为什么 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/

相关文章:

java - 如何使用 ExoPlayer 播放 DES 加密文件

iphone - 在 iPhone 上加载大图像最快的方法是什么?

python - 减少大量数据帧的 pandas concat 的内存使用量

language-agnostic - 学习垃圾收集理论

.net - C# 如果我以优先级 = RealTime 运行进程,GC 会发生什么?

java - Web 服务方法结果的类是什么?

Java 用一个参数比较对象

java - 基于嵌套文档的可用部分数据进行查询(在morphia、mongoDB中)

C#内存开销从何而来

android - 为什么 Android ART 有时不会在离开作用域时对局部变量进行 GC?