如果我使用-Xmx512m在Linux上使用jre 8u74启动Java应用程序,则不立即分配内存,如果Java需要,则分配内存。因此,如果没有必要,它可以保持低于512 MB的限制。这就是我所期望的。
在Java 8u111上我得到了另一种行为,即使Java不需要,也会立即将512 MB内存分配给进程。这很烦人,因为即使Java不需要它也不能被其他进程使用。
我看了Java jre的发行说明,从8u74开始直到当前最新的8u111,但我找不到任何关于内存分配策略变化的参考。
有人可以在Java 8范围内确认此分配策略更改吗? 是否有选项可以使用以前的内存分配行为?
编辑1 - -XX:+ PrintFlagsFinal差异(由8472建议)
diff java-info-8u111.txt java-info-8u74.txt
161d160
< bool CrashOnOutOfMemoryError = false {product}
199d197
< bool ExitOnOutOfMemoryError = false {product}
636d633
< bool UseCountedLoopSafepoints = false {C2 product}
666,668d662
< bool UseMontgomeryMultiplyIntrinsic = false {C2 product}
< bool UseMontgomerySquareIntrinsic = false {C2 product}
< bool UseMulAddIntrinsic = false {C2 product}
698d691
< bool UseSquareToLenIntrinsic = false {C2 product}
729,731c722,724
< java version "1.8.0_111"
< Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
< Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
---
> java version "1.8.0_74"
> Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
> Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
编辑2 - 相关问题
编辑3 - 解决方案
问题与Java8 / 9和Jetty9的组合有关。解决方法是注释掉Jetty annotations.mod的内容。请参阅this related question.的完整答案 感谢所有建议和新的调试思路。