当前位置: 首页 > 科技观察

如何诊断Java中的内存泄漏

时间:2023-03-17 23:18:05 科技观察

每次我怀疑内存泄漏时,我都会翻找这些命令。因此,这里总结一下供以后使用:首先,我使用以下命令监视进程:while(sleep1);dops-p$PID-o%cpu,%mem,rss;done(和NewRelic,如果可用)如果你看到内存快速增加,可能是因为VM设置。如果您没有明确指定JVM的内存设置,它会为它们设置默认值。要获得默认值,请使用以下命令:java-XX:+PrintFlagsFinal-version|grep-iHeapSize如果这些都不符合您的要求,那么您需要指定JVM的内存设置。您可以使用以下命令设置最小和最大堆大小:java-Xms128m-Xmx256m尽管您有合理的内存设置并且可以监视进程,但您仍然可能会看到内存随时间增加。要进一步调查原因,可以使用以下命令查看对象实例的直方图:jmap-histo$PID如果仍然没有足够的信息,可以使用以下命令进行堆转储:jmap-dump:format=b,file=/tmp/dump1.hprof$PID通常,我会获取两个堆转储并使用以下jhat命令比较它们:jhat-baseline/tmp/dump1.hprof/tmp/dump2.hprof此命令启动HTTPserver,您可以使用它来探索两个堆转储之间的区别。默认情况下,HTTP服务器在端口7000上启动,您可以在浏览器中访问该端口。如果你有防火墙并且可以通过SSH访问,那么你可以使用以下命令连接到这个端口:ssh-L7000:localhost:7000$HOST向下滚动到***页面的底部,你会看到两个有用的links:ShowheaphistogramShowinstancecountsforallclasses(excludingplatform)这将向您显示不同堆转储之间的所有“新”实例,应该可以帮助您检测泄漏的来源。这是一个屏幕截图:然后您可以快速查看魔法命令行的目录,以防您需要诊断内存泄漏(我一直忘记)。