我正在为用Java编写的应用程序分配最大8GB内存。它失去了记忆。我相信,在默认情况下,年轻一代总是比老一代少(堆的1/4)。伊甸园/幸存者1,2在年轻一代中。我相信新的物体是在伊甸园空间里创造出来的。
java应用程序是否仍然内存不足,即使老一代还没有满,但是年轻一代已经完全满了?
如果短命对象比长寿对象多,那么是否可以将更多内存分配给年轻一代,或者至少将堆的50%分配给年轻一代?或者,由于jvm的维护,应该总是堆的1/4吗?
发布于 2020-01-30 23:03:45
首先,1/4似乎是另一回事。这就是将多少内存分配给您的堆,除非您指定了-Xmx (当您在容器中时,它与您启用的标志略有不同)。
:java应用程序是否仍然内存不足,尽管老一代还没有满,但是年轻一代已经完全满了?
不是的。当年轻的Eden满员时,从这些活动对象移到Survivor,当幸存者的对象“生存”足够多的GC周期时,它们被移动到旧的区域(用XX:MaxTenuringThreshold控制)。当老一代达到一定的极限(IHOP in G1)时,就会发生接触老一代的GC循环。一些more details here。
如果短命对象比长寿对象多,那么是否可以将更多内存分配给年轻一代,或者将堆的至少50%分配给年轻一代?
年轻地区越大,停顿的时间就越长。年轻的GC周期总是停止世界的事件,所以让它们太大是不好的。此外,这将影响您的-XX:MaxGCPauseMillis;并且也不会单独这样做:默认情况下是G1 GC will adjust regions as it finds most appropriate to。
https://stackoverflow.com/questions/59993585
复制相似问题