JVM - 年轻一代和老一代的比例/分配



我正在为用Java编写的应用程序分配8GB的最大内存。它耗尽了内存。我相信默认情况下,年轻一代总是比老一代小(堆的 1/4(。而伊甸园/幸存者 1,2 在年轻一代体内。我相信在伊甸园空间中创造了新的物体。

即使老一代没有满,但年轻一代已经完全满了,java应用程序仍然会耗尽内存吗?

如果存在比长生存期对象更多的短期对象,是否可以为年轻一代分配更多的内存或至少将堆的 50% 分配给年轻一代? 还是由于 jvm 维护,它应该始终是堆的 1/4?

首先,1/4似乎是另一回事。这就是将分配给堆的内存量,除非您指定-Xmx(当您在容器中以及启用了哪些标志时,它会有所不同(。

即使老一代没有满,但年轻一代已经完全满了,java应用程序仍然会耗尽内存吗?

不。当幼Eden充满时,来自该活的物体被移动到Survivor,当来自幸存者的物体"存活"足够的GC循环时,它们被移动到旧区域(用XX:MaxTenuringThreshold控制(。当老一代达到一定的极限(IHOPG1(,就会发生一个接触老一代的GC循环。更多细节在这里。

如果存在比

长生存期对象更多的短期对象,是否可以为年轻一代分配更多的内存或至少将堆的 50% 分配给年轻一代?

年轻区域越大,停顿时间越长。年轻的GC周期总是停止世界的事件,所以把它们弄得太大是不好的。除此之外,这会影响您的-XX:MaxGCPauseMillis;并且不要自己这样做:默认情况下,G1 GC 将调整它认为最合适的区域。

最新更新