我有一个企业应用程序,我正在处理它,目前它在登台环境中。服务器有24 GB的RAM。但平均15-20天后,服务器宕机,我们在服务器日志中看到内存空间不足错误。我使用的是J2EE、spring、hibernate、memcache、ehcache、mysql和tomcat8。我使用nginx进行集群,tomcat服务器有3个节点。
请建议/帮助我应该做什么,因为我无法跟踪/获取此错误的来源和发生内存泄漏的位置。
谢谢
发布于 2017-09-13 10:53:49
您的程序可能正在分配堆中的许多对象,并且永远不允许垃圾收集器释放它们。
要进行诊断,您可以对您的服务执行堆转储,这可以使用以下命令完成:
jmap -dump:format=b,file=dump.bin <pid>其中,<pid>是您的Java服务的进程id (您可以使用命令ps faux | grep java找到它)。
然后,您可以使用VisualVM打开文件dump.bin并检查它,以查看哪些对象正在使用您的堆中的大部分内容。
因为堆转储将很大,并且将包括准备进行垃圾收集的对象,所以您可能希望告诉jmap只将那些不能被垃圾收集的对象放入堆转储中,这可以通过向jmap命令添加标志live来完成:
jmap -dump:live,format=b,file=dump.bin <pid>下面是使用VisualVM检查堆转储的说明:https://docs.oracle.com/javase/8/docs/technotes/guides/visualvm/heapdump.html
发布于 2017-09-13 10:53:07
使用how-to-collect-a-heap-dump获取堆转储,使用名为Mat的eclipse工具对其进行分析。这将使你清楚地了解你的内存,并让你知道在你的代码中导致OOM错误的地方是什么。
https://stackoverflow.com/questions/46188057
复制相似问题