客户抱怨他在Java应用程序中遇到内存泄漏。
尽管我努力重现他的环境,配置和使用,但我无法重现并因此识别泄漏。
我想沿着另一条路走下去...也许我可以让他生成他的堆的一些视图,这样我就可以识别漏洞了。
由发送给我的客户经营,对此有一些要求:
因为1.和2而无法完成堆转储。
最重要的是,它应该让我找到泄漏。所以它至少应该显示每个类的对象的保留堆大小(自身的大小+它保留引用的所有内容)。
jmap -histo
绝对不够好。
num #instances #bytes class name
----------------------------------------------
1: 14156 577318512 [B
2: 9196 47439696 [I
3: 83396 9809992 [C
这样的东西有用吗?我不这么认为。
答案 0 :(得分:1)
在不了解您和您的客户的情况下,很难发表评论但根据我的经验,客户告诉我我们有内存泄漏(特别是在Java中)只是意味着“客户的系统有一些问题,可能是也可能不是与我们的应用程序相关“
我从一个简单的事情开始,找出他认为你的应用程序有泄漏的原因(即ps或任务管理器输出显示流程大小)
答案 1 :(得分:0)
您可以让客户端运行jhat并以某种方式远程连接到它启动的Web服务器。
答案 2 :(得分:0)
是否允许客户自行进行内存转储而不将其发送给您?
如果可以的话,Eclipse Memory Analyzer有一个非常容易使用的向导,它将生成泄漏可疑报告。报告本身很小。
答案 3 :(得分:-1)
我会使用堆转储并使用YourKit进行分析。 (我发现jhat在大型应用程序中太难了)