【发布时间】:2015-02-16 10:54:59
【问题描述】:
固定的堆大小永远不会是最佳的。您要么将其设置得太低并耗尽内存,要么将其设置得太高并浪费内存。并行运行的 JVM 进程越多,这个问题就越严重。即使对于一个 JVM,也不可能使用一台机器中的所有 RAM。越接近最大值,被OOM杀手杀死的风险就越大。
我理解固定堆大小的原因:垃圾回收。在不知道还有多少可用内存的情况下,JVM 将不知道何时执行 GC。
一个想法是将这个决定从 JVM 传递给内核。内核可以做出最优的全局决策,而不是次优的局部决策。我想这可以通过引入一个告诉 JVM 执行 GC 的新信号来工作。每当需要回收一些内存时,内核就会发送此信号。
这样的事情存在吗?我误解了这个问题吗?这是个坏主意吗?
【问题讨论】:
-
你误解了这个问题。至少对于 Oracle/OpenJDK,内核不参与 GC。堆是在 JVM 启动时预先分配的,直到程序退出时内核才会触及。
-
堆没有预先分配。仅保留虚拟地址空间,但并未实际分配。
标签: java linux garbage-collection jvm