2013-02-18 69 views
1

我有一个正在运行的Scala进程,并希望在该进程中获取List的内容。我知道进程的PID,并且知道List [String]的名称,并且我已经使用VisualVM进行了堆转储。有没有办法让我找到特定列表的实际内容并将它保存在某个地方?获取正在运行的进程中的scala List的内容?

回答

4

如果List[String]实例被类引用(例如通过val),那么您可以查找包含它的类。

  • 你可以下载Eclipse Memory Analyzer (MAT)并打开你的堆转储。
  • 然后,您可以点击'Dominator tree',在表格的顶部可以输入保存列表的类的名称。
  • 如果您已经找到该类,请右键单击它并选择“列出对象 - >使用传入引用”,这应该为您提供所有可能包含该列表的类的实例。
  • 右键单击其中一个实例,然后选择“列出对象 - >即将离任的参考文献”,这应该给你一个树状结构,你会发现你的列表
  • 注意,一旦你发现你的列表,你可以检查出(检查员面板),其中包含可读信息。

注意:上述步骤是从我的头顶开始的,因此它们可能不完全准确。但是,这应该给你一个很好的方向感。

祝你好运!

+0

谢谢,我会给你一个机会! – mrjf 2013-02-18 22:23:17

+0

工作!谢谢。 – mrjf 2013-02-19 05:14:57

2

我确定原则上它是可能的,但肯定没有什么简单或直接的和现成的允许你这样做。

我可能会使用Java Platform Debugger Architecture (JPDA)及其Java Debugging Wire Protocol (JDWP)来获取您需要的原始信息。从那里您可以使用Java和/或Scala反射来发现要在目标JVM中查询的内容。

我不知道这是多少适用于堆转储。在过去,C/Unix调试工具可以在核心转储或活动进程上运行。

+0

感谢您的帮助和工具的参考,我会报告什么对我有用。 – mrjf 2013-02-18 22:23:58

相关问题