我试图找出主要操作系统上Java Attach API使用的进程间通信机制,但我似乎找不到对底层机制的太多引用.
我发现的唯一提及是在这里它指的是由Sun公司开发的,前一段时间的DOORS进程间通信机制 但我怀疑这是在Windows或Mac上使用的.大多数文章描述了Java Attach API以及如何加载共享库/ DLL,但是没有说明jvisualvm和本地JVM进程之间的通信是如何实际工作的.
这里提到tools.jar并且libattach.so(在Unix系统上)或attach.dll(在Windows上)负责支持Attach API,但我找不到很多关于它们如何在内部工作的细节.
那么Java Attach API的进程间通信如何在每个主流操作系统上运行?也就是Windows,Mac OSX和Linux.
根据本教程,我尝试使Java代理正常工作。 https://www.baeldung.com/java-instrumentation#loading-a-java-agent
我知道[Agent] Transforming class TestApplication
我没有错误,但是看不到转换类的任何效果。
最终,我希望同时使静态负载和动态负载都能工作,但现在我主要关注静态方式。
public class Static_Agent {
public static void premain(String agentArgs, Instrumentation inst) {
String[] tokens = agentArgs.split(";");
String className = tokens[0];
String methodName = tokens[1];
System.out.println(">> "+className);
System.out.println(">> "+methodName);
transformClass(className, methodName, inst);
}
public static void transformClass(String className, String methodName, Instrumentation instrumentation) {
Class<?> targetCls = null;
ClassLoader targetClassLoader = null;
// see if we can get the class using forName
try {
targetCls = Class.forName(className);
targetClassLoader = targetCls.getClassLoader();
transform(targetCls, methodName, targetClassLoader, …Run Code Online (Sandbox Code Playgroud)