开发者

Getting real-time variables from a java runtime environment's (virtual machine) memory?

开发者 https://www.devze.com 2022-12-21 06:49 出处:网络
Say I have a couple of java runtime environments running on my system which are used by several applications. I would like to programmatically interact with these applications by reading their memory.

Say I have a couple of java runtime environments running on my system which are used by several applications. I would like to programmatically interact with these applications by reading their memory.

A typical approach would be to directly look into t开发者_开发技巧his application's memory, however for java applications this seems to be practically impossible because of the java runtime environment. Instead, one has to look into the memory of the java runtime environment, or debug it.

[ the above is what I think I have learned from several searches on the web, if anything is false, please correct me ]

Note: keep in mind that the application I want to monitor is not owned by me and thus I do not have the source code nor the ability to launch the application in "debug mode" or something.

Now, as this is a non-production project, I would prefer an easy way out: using an existing windows GUI application which can already monitor variables of a java runtime environment and it's applications to programmatically crawl these from this GUI application for usage in my own project. If any such program exists, I would really appreciate the help.

If the above is not possible, how would I (programmatically) retreive these variables otherwise?


It's difficult to answer this precisely without knowing much more about the application involved, its structure etc. Note that objects move around in the JVM's memory, and so you can't monitor the actual application memory directly.

So the first question is, how do you know what you want to monitor without the source code ? e.g. which variables/objects etc.?

Given that you've worked this out, it strikes me that you have two options.

  1. decompile and instrument the application (perhaps statically, perhaps using AOP), and recompile it. This assumes that the application is not obfuscated, and you're not in breach of licensing etc.
  2. wrap the application in a thin layer that uses reflection to identify the variables you're interested in, and tracks the values of those variables as the process executes. I suspect you'll still have to decompile to identify these variables.

You can monitor these values remotely by creating an MBean and exposing via JMX, and monitoring via JConsole. That's pretty trivial compared to the initial step of finding those variables you're interested in.

0

精彩评论

暂无评论...
验证码 换一张
取 消