我为生产团队写了一个应用程序来测量他们的分数,它可以正常运行2-3周,然后运行副本的机器变慢,重新启动就可以修复它。
修复此问题的最佳实践步骤是什么?
发布于 2011-10-01 00:42:30
您需要分析堆,找出哪些对象被保留在其中,而这些对象不应该被保留。
一种选择:
尝试减少jvm最大堆大小以加快内存不足异常,在启动-XX:+HeapDumpOnOutOfMemoryError时将此选项添加到-Xmx,然后将生成的堆转储加载到类似Eclipse Memory Analyzer的文件中。
另一种选择:
使用jmap从正在运行的进程转储堆(可能需要sudo权限)
jmap -heap:format=b <pid>再次将堆转储二进制文件加载到jhat或Eclipse Memory Analyzer中。
如果你的应用变慢了,但没有抛出OutOfMemoryError,很可能你没有泄漏,但你确实需要做一些 ,因为它花了太多的时间做GC。
您应该监控GC收集时间(您可以使用-Xloggc:/tmp/gc.out记录它们),或者您可以使用jstat来查看GC发生的频率和时间。
如果你的应用程序有很多中级对象,那么年轻一代是否足够大(-XX:NewRatio=N)?如果不是这样,你的应用程序将花费很长时间将对象升级到旧Gen,但不久之后就不得不对它们进行GC (相对于新gen,旧gen中的GC成本很高,特别是当你有碎片内存的时候)。
另外-您是否启用了CMS收集器?如果你有一台多核机器,我建议你这样做(-XX:+UseConcMarkSweepGC)。
发布于 2011-10-01 00:42:49
Java中没有传统意义上的内存泄漏,除非您使用的是JNI。
Java中的内存泄漏通常指的是创建不再使用的引用对象。典型的症状是应用程序的内存使用量持续增长。您是否看到内存使用量在增长?
你最好在谷歌中搜索完全相同的问题,并遵循链接。
要解决的最佳实践是通常使用Profiler来检查您的分配情况。它还可能指向不是由“内存泄漏”引起的性能瓶颈。
发布于 2011-10-01 00:45:29
您可以使用OS实用程序检查JVM所需的内存,比如任务管理器或top。
您可以使用分析器来检查java代码的内存,例如Java VisualVM。
请记住,Java使用垃圾收集,因此“内存泄漏”的唯一方法是持有对(许多)未使用对象的引用。Josh Bloch's Effective Java第6项(消除过时的对象引用)解释了这些情况以及如何很好地防止它们。
您还可以使用其他方法来检查这种“内存泄漏”,例如或。
https://stackoverflow.com/questions/7613429
复制相似问题