所以我试图从 C 代码读取 Java 进程的内存。我找到了有关 JVM 结构(堆、永久代、方法区等)的文档,但这些文章都没有真正展示如何查找这些区域在内存中的位置。
据我了解,类存储在方法区中,堆中前 32 位的所有实例都有一个指向这些类的指针(我指的是 x86 JVM)。我尝试过 JDK 中提供的 jmap 和 jhat 实用程序,希望能够找到内存位置的“模式”,但未能成功,因为它们只显示实例的内存位置。 ClassLoader 不提供任何指向类和静态字段的指针,但我通过在 java 程序中应用反射并查看引用的 找到了 Class 对象的一些内存位置>Class
对象内存位置。必须有某种方法来确定这些东西的存储位置,否则 Java 进程也不知道如何获取它们。
任何人都可以提供一些有关如何在内存中查找实例、类、静态字段的见解或为我指明正确的方向吗?
我知道可以通过 Java 代码实现,但我需要用 C 语言实现。使用 JNI 或修改 Java 程序也是 Not Acceptable ,因为我需要完全用 native 代码编写它。
最佳答案
HotSpot Serviceability Agent可以做到这一点。它知道如何从外部 Java 进程的内存或核心转储中重建 JVM 结构。
可维护性代理有 Java API位于{JDK}/lib/sa-jdi.jar
。用 C 语言实现类似的功能是可行的,尽管需要付出很大的努力。
不管怎样,你可以看看SA来源here .
关于java - 从 C 读取和解释 JVM 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39126185/