我们的prod服务器中的eden空间很快被填满,导致定期进行小型收集。下图显示了日志文件的GC分析。
下面列出了VM选项。
<jvm-options>-XX:SurvivorRatio=6</jvm-options>
<jvm-options>-XX:NewSize=1344m</jvm-options>
<jvm-options>-XX:MaxNewSize=1344m</jvm-options>
<jvm-options>-Xms3072m</jvm-options>
<jvm-options>-Xmx3072m</jvm-options>
<jvm-options>-XX:MaxPermSize=400m</jvm-options>
<jvm-options>-XX:NewRatio=2</jvm-options>
这是否因内存泄漏而发生?
非常感谢任何帮助。
答案 0 :(得分:2)
繁忙的应用程序每秒可以创建大约1/2 GB的垃圾。在伊甸园空间填满之前,这会给你大约2.5秒的垃圾。如果您创建的数据少于此数,则您的应用程序不会那么繁忙或具有高效代码。
如果你想减少你产生的垃圾量,我建议你用VisualVM或YourKit之类的东西来分析你的应用程序。另一种方法是增加伊甸园空间。例如我会从8G或16GB或1/3的内存开始。并在调整应用程序时减少它。
答案 1 :(得分:0)
不是内存泄漏,但是你创建了很多临时对象。我遇到了一个问题,我们正在用3d点进行大量计算,这些计算都是为每个临时结果创建一个新对象(在C ++中可能正常工作),但它在垃圾中每秒生成千兆字节。在重写之后,它将尽可能多地重用对象,它降至每秒20兆。
你能做什么?如果是你的代码,尝试使用预期的目标大小预分配数组,列表和strin buffrs;避免字符串连接;重用ovjects。如果你有很多框架代码和库,你只能尝试调整伊甸园空间;检查是否将它缩小有助于你的情况(yoy会得到更多更快完成的GC事件,你需要测量它是否有帮助)。