如何从正在运行的应用程序的堆转储中提取 java 类定义?

Posted

技术标签:

【中文标题】如何从正在运行的应用程序的堆转储中提取 java 类定义?【英文标题】:How to extract java class definitions from a heap dump of a running application? 【发布时间】:2016-04-25 05:57:17 【问题描述】:

从堆转储中提取类定义的需求来自于一些类的动态加载方式,而不是从静态库 jar 中,而是动态编译或通过网络加载。堆转储的大小与实际堆的大小相同,因此我假设所有类都在那里,可能在 permgen 中。目的是以 .class 文件的形式提取定义以供进一步检查。

【问题讨论】:

我很可能是错的,但我认为没有任何工具可以让您检索类定义。可以通过使用代理或自定义类加载器从程序本身写出类位来做到这一点。 【参考方案1】:

似乎没有任何工具可以让您轻松地从 VM 中检索类位,更不用说从堆转储中检索了。也不清楚类定义是否与 VM 中的 .class 的内容格式完全相同。

但是在类定义被加载到 VM 之前,有多个选项可以保存它。您可以拥有一个可以将类定义存储在堆或外部存储中的代理。这也应该可以通过自定义类加载器实现,但它可能会被其他一些客户类加载器绕过。

流行的 AOP 工具 AspectJ 可以选择保存检测类的定义;它可能可用于您的用例。

【讨论】:

以上是关于如何从正在运行的应用程序的堆转储中提取 java 类定义?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何在java中的堆上单独获取所有对象消耗的运行时内存

如何从核心转储文件中提取 AT_EXECFN

从磁盘转储中提取 jpeg

在 OQL 的堆转储中获取类的静态字段

您可以从 IBM PHD java 堆转储中提取字符串的值吗?

PHP:如何从字符串转储中提取 JSON 字符串