Java堆行为

Ren*_*Ren 9 java memory oracle heap jvm

给出如下的java内存配置

 -Xmx2048m -Xms512m
Run Code Online (Sandbox Code Playgroud)

当内存使用量增加超过512米时,VM的行为是什么?是否有一个特定的算法?即.它是直接达到最大值,它是否加倍,它是以增量为单位,还是仅在需要内存时分配?手术有多贵?

我正在专门研究Oracle/Sun JVM 1.6版.我认为这是在Oracle网站上记录的,但我找不到它.

Aff*_*ffe 6

垃圾收集器的工作是决定何时需要调整大小,因此它由GC参数'MinFreeHeapRatio'决定.如果GC需要更多空间,它将增长到该值指定的堆的%可用的大小.

现代平台上的典型值是40ish,所以如果你从512MB开始并且免费不到40%,这意味着你超过了~308MB,它将增加到40%再次免费.所以说收集后仍然有400MB的活动对象,你的堆将达到~667MB.(是的,它被命名为比率,但期望%值作为参数...搜索我!)

注意这有点不精确,垃圾收集器是"世代"的,实际上可以调整各代的大小,但它也有代数大小之间的强制比例,如果你的对象分布在长寿命和短寿命之间,大致与它估计的方式一致,它信封后面的效果非常好.

这适用于Java 6中的默认值.如果使用自定义垃圾收集器配置,则可能不同.你可以在这里阅读:http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html#generation_sizing.total_heap

(操作类型的"费用"取决于操作系统和其他正在发生的事情.如果系统已经下载并且操作系统必须进行一些交换以为您创建连续的内存块,那么它可能是非常贵!)