【问题标题】:access running JVM raw memory访问正在运行的 JVM 原始内存
【发布时间】:2009-12-03 05:04:00
【问题描述】:

如果这是一个无知的问题,请原谅我,我不是一个专业的程序员,只是好奇。是否可以从正在运行的程序内部读取工作内存,例如类的实例?

我知道您可以执行println(theInstance.getClass()); 之类的操作,它会为您提供实例的内存地址(我假设它是这样的)。我想知道是否可以做类似byte[]memory = theInstance.getClass().getMemory(); println(toString(memory)); 之类的事情,我知道这都是虚构的,只是为了说明。

【问题讨论】:

  • 有可能。但我不认为这对你有多大好处。这将是虚拟内存地址。所以它只在那个 JVM 内部相关——真的是那个过程。
  • 地址不是很有用的原因是执行 gc 时对象可以移动。基本上你不需要知道 Java 中这种级别的信息。
  • 感谢您的回复。我想我没有考虑任何特定用途,只是想知道是否可能。我刚刚意识到我正在考虑打印一个数组。当我在其中包含一个类实例的数组上执行 println() 时,我会在 @ 之后得到一个地址,如下所示:[0] sketch_dec03a$MyClass@141fab6 这就是来自 Processing (processing.org) 的方式,我得到我所有的 Java 经验。

标签: java jvm memory-dump


【解决方案1】:

不使用标准 Java API。但是,您可以通过sun.misc.Unsafe 访问内存(您可能需要使用反射来获取此类的实例)。当然,您也可以通过 JNI 做到这一点。

但是你为什么想要呢?

【讨论】:

  • @Tom - 实际上,我不认为 JNI 确实允许您获取原始内存本身。相反,它提供了获取和设置(例如)对象字段的方法。 (如果您知道 JNI FieldID 的内部表示是什么,也许您可​​以“冲破”抽象障碍......)
【解决方案2】:

不,打印 getClass() 的结果不会给出“内存地址”;它给出了一个类的字符串表示(类似于“class Argyle”)。

从您的问题来看,您还不清楚您希望这样的内容是什么。如果您想了解 Java 如何表示内存中的对象,请阅读VM specification。再说一次,the Java virtual machine does not mandate any particular internal structure for objects

【讨论】:

    【解决方案3】:

    我最近没有看过这个,但如果在 Linux 上你可以寻找/阅读/proc/PID/mem

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2011-04-11
      • 2015-10-19
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      相关资源
      最近更新 更多