从 C 读取和解释 JVM 内存

Reading and interpreting JVM memory from C

所以我试图从 C 代码中读取 Java 进程的内存。我找到了关于 JVM 结构(堆、perm gen、方法区等)的文档,但这些文章中的 none 实际上展示了如何找到这些区域在内存中的位置。

据我了解,类 存储在方法区中,堆中前 32 位的所有实例都有一个指针(我说的是 x86 JVM)指向这些 类.我已经尝试了 JDK 中提供的 jmap 和 jhat 实用程序,希望我能找到内存位置的 "pattern",但没有成功,因为它们只显示实例的内存位置。 ClassLoader 不提供任何指向 类 和静态字段的指针,但我通过在 java 程序中应用反射并查看引用的内容,找到了 Class 对象的一些内存位置Class 对象内存位置。必须有某种方法来确定这些东西的存储位置,否则 Java 进程也不知道如何获取它们。

任何人都可以提供一些关于如何查找实例、类、内存中的静态字段的见解或为我指明正确的方向吗?

我知道可以通过 Java 代码实现,但我需要在 C 中使用它。使用 JNI 或修改 Java 程序也是不可接受的,因为我需要它完全用本机代码编写。

HotSpot Serviceability Agent可以做到这一点。它知道如何从外部 Java 进程或核心转储的内存中重建 JVM 结构。

Serviceability Agent 在 {JDK}/lib/sa-jdi.jarJava API 个可用。用 C 实现类似的功能是可行的,尽管需要付出很多努力。
无论如何,您可以查看 SA 来源 here.