java - 用于列出 Java 程序内存中的变量名称和值的脚本或程序(内存快照)

标签 java memory jvm

我有一个在 JVM 中运行的 Java 程序。我需要随时找出内存中存储的变量是什么。我需要列出它们的名称和值。可以使用任何语言或脚本编写此程序。

我已经使用 JMAP 和 JHAT 来获取堆转储并查看转储值。但它没有给出我想要的。

感谢任何帮助。谢谢!

最佳答案

YourKit是城里最好的分析仪之一,但价格相当昂贵。而且,虽然他们可能会为您提供免费试用期,但这对您下次需要对下一个项目进行类似测试时没有任何好处。

我建议使用优秀的 ole JRE 附带的内容:JVisualVM 。它具有您正在寻找的所有功能(在运行时动态检查变量/对象),以及监视堆/线程 Activity 、执行堆/线程转储并分析它们的能力,甚至拥有自己的对象查询语言( OQL)用于根据特定条件从转储中查询对象值。

缺点是它会带来适度的性能开销,因此您只想在非生产环境中运行它。 (对于低开销生产监控,使用类似 AppDynamicsNew Relic )。 JVisualVM 的性能开销会影响代码的运行速度吗? 是的。 但是由于您将为每个测试用例运行它,所以所有测试用例都会受到同等的影响。

所以,听起来您希望将其作为基本工作流程:

  1. 启动您的应用/JVM
  2. 启动 JVisualVM
  3. 开始使用 JVisualVM 分析(“快照模式”)您的应用
  4. 运行下一个测试。
  5. 停止分析您的应用
  6. 执行堆和/或线程转储并将其保存在文件系统的某个位置
  7. 如果需要进行更多测试,请返回#3。
  8. 否则停止您的应用
  9. 在 JVisualVM 中,逐一加载每个堆/线程转储,可能使用 OQL 来获取您正在查找的对象/变量,并将每个测试用例的性能与其他测试用例进行比较

祝你好运,HTH。

关于java - 用于列出 Java 程序内存中的变量名称和值的脚本或程序(内存快照),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20252165/

相关文章:

打包成 jar 时找不到 Java JSoup 库

java - 从 JVM fatal error 日志中猜测方法行号

java - 属于同一类或继承类的包中的条目

java - Apache Spark 错误使用 hadoop 将数据卸载到 AWS S3

java - logback 行号未显示在日志中

c - 尝试访问结构中的空指针时出现段错误

r - 使用具有 gmp 和机器限制的大整数

java - ArrayList不同方法的作用域

memory - 关闭 D 垃圾收集器

java - java是否在内部创建持有main方法的类的对象?