领先一步
VMware 提供培训和认证,助您加速进步。
了解更多我今天在使用 Yourkit 时获得了非常棒的体验,因此我想写一篇快速的推荐。自从我上次认真使用它以来已经有几年了,即使在那时它也是我能找到的最好的工具,但现在它确实超级流畅。我没有对市场进行详尽的调查,那也不是本次练习的目的:我只想用一个工具来解决问题。
这是我一天故事的记录;起初是沮丧,然后是恼火,最后是满意。我怀疑 Spring Batch 中存在内存泄漏,并且需要尽快找到它。这背后的故事是,我见过很多内存泄漏,但已经很久没有亲自处理过了。现在我生活在 STS 中(有时甚至在其中做梦),所以我需要一个在 IDE 中运行良好的工具。我尝试了两个工具,但只是因为第一个选择不起作用。我尝试的两个工具是 TPTP 和 Yourkit。
我用 JUnit 编写了一个简单的集成测试,并使用这两个工具对其进行了性能分析。通过其中任何一个工具的内存分析,我都能看出我的进程结束时堆中有太多 JobExecution 类型的对象,我当时只需要知道是谁在持有它们不该有的引用?这似乎是一个足够简单的问题。
由于 Eclipse 是 STS 的核心,我想看看 Eclipse 的性能监控工具 (TPTP) 是否比我上次尝试时有所改进。经过半天的折腾,简短的回答是“没有”。冗长的解释是,它在不安装晦涩的过时共享库(在 Ubuntu Ibex 上)的情况下根本无法运行,即使运行了,内存分析中的信息也少得可怜,无法追踪内存泄漏。Google 可以帮助你解决第一个问题(我不知道为什么 TPTP 在这方面文档如此糟糕),但无法解决第二个问题。我能从 TPTP 中获取足够的信息来看到存在泄漏,但我仍然不知道它来自哪里。问题是,报告只告诉你堆中的对象以及分配它们的原始代码行,这对于知道进程结束时谁持有对它们的引用来说太遥远了。结论:TPTP 比几年前有了巨大的进步,但从实际应用角度来看仍然 pretty useless。
于是我转向了 Yourkit,我知道它可以轻松解决这个问题,但对安装和工具却有些担忧。我发现 Eclipse 工具现在非常棒(我上次看的时候还没有),而且更好的是,我在大约 5 分钟的工作后找到了内存泄漏的根源。不算差。如果你想知道它的杀手级功能,那就是:能够浏览堆和所有对象引用。此外,当进程结束时自动采取快照也很有帮助,因此你可以编写一个简单的单元测试,从 IDE 中对其进行性能分析,然后只需点击几下即可将堆加载到 Yourkit UI 中。
如果你好奇的话,Spring Batch 的问题很小(并且只影响了快照版本),而且很容易修复。
我知道 Mark、Filip 和 SpringSource 的其他同事也在使用 Yourkit(例如,参见这篇博文),而且我问过的每个人都很喜欢它。但是,如果我们将其提及在文章和咨询案例中,它往往会被淹没在大量其他内容中,所以我希望这篇小文章能让 Yourkit 跃升到你的优先关注列表。
免责声明:我对 Yourkit 没有个人或商业利益。