我有一个在 JVM 中运行的 Java 程序。我需要随时找出内存中存储的变量是什么。我需要列出它们的名称和值。可以使用任何语言或脚本编写此程序。
我已经使用 JMAP 和 JHAT 来获取堆转储并查看转储值。但它没有给出我想要的。
感谢任何帮助。谢谢!
最佳答案
YourKit是城里最好的分析仪之一,但价格相当昂贵。而且,虽然他们可能会为您提供免费试用期,但这对您下次需要对下一个项目进行类似测试时没有任何好处。
我建议使用优秀的 ole JRE 附带的内容:JVisualVM 。它具有您正在寻找的所有功能(在运行时动态检查变量/对象),以及监视堆/线程 Activity 、执行堆/线程转储并分析它们的能力,甚至拥有自己的对象查询语言( OQL)用于根据特定条件从转储中查询对象值。
缺点是它会带来适度的性能开销,因此您只想在非生产环境中运行它。 (对于低开销生产监控,使用类似 AppDynamics 或 New Relic )。 JVisualVM 的性能开销会影响代码的运行速度吗? 是的。 但是由于您将为每个测试用例运行它,所以所有测试用例都会受到同等的影响。
所以,听起来您希望将其作为基本工作流程:
- 启动您的应用/JVM
- 启动 JVisualVM
- 开始使用 JVisualVM 分析(“快照模式”)您的应用
- 运行下一个测试。
- 停止分析您的应用
- 执行堆和/或线程转储并将其保存在文件系统的某个位置
- 如果需要进行更多测试,请返回#3。
- 否则停止您的应用
- 在 JVisualVM 中,逐一加载每个堆/线程转储,可能使用 OQL 来获取您正在查找的对象/变量,并将每个测试用例的性能与其他测试用例进行比较
祝你好运,HTH。
关于java - 用于列出 Java 程序内存中的变量名称和值的脚本或程序(内存快照),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20252165/