From 7e7ea3d3d81eef2e91d3706f6cc2072a7ce66578 Mon Sep 17 00:00:00 2001 From: luyanbo Date: Fri, 17 Jun 2022 15:38:18 +0800 Subject: [PATCH 1/6] prevent parallel appendToSystemClassLoaderSearch --- .../plugin/InstrumentationWrapper.java | 96 +++++++++++++++++++ .../oneagent/plugin/PluginManagerImpl.java | 4 +- 2 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java new file mode 100644 index 0000000..75a5c52 --- /dev/null +++ b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java @@ -0,0 +1,96 @@ +package com.alibaba.oneagent.plugin; + +import java.lang.instrument.ClassDefinition; +import java.lang.instrument.ClassFileTransformer; +import java.lang.instrument.Instrumentation; +import java.lang.instrument.UnmodifiableClassException; +import java.util.jar.JarFile; + +public class InstrumentationWrapper implements Instrumentation{ + private final Instrumentation instrumentation; + + private final Object lockForAppend = new Object(); + + public InstrumentationWrapper(Instrumentation instrumentation) { + this.instrumentation = instrumentation; + } + + @Override + public void addTransformer(ClassFileTransformer transformer, boolean canRetransform) { + instrumentation.addTransformer(transformer, canRetransform); + } + + @Override + public void addTransformer(ClassFileTransformer transformer) { + instrumentation.addTransformer(transformer); + } + + @Override + public boolean removeTransformer(ClassFileTransformer transformer) { + return instrumentation.removeTransformer(transformer); + } + + @Override + public boolean isRetransformClassesSupported() { + return instrumentation.isRetransformClassesSupported(); + } + + @Override + public void retransformClasses(Class... classes) throws UnmodifiableClassException { + instrumentation.retransformClasses(classes); + } + + @Override + public boolean isRedefineClassesSupported() { + return instrumentation.isRedefineClassesSupported(); + } + + @Override + public void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException { + instrumentation.redefineClasses(definitions); + } + + @Override + public boolean isModifiableClass(Class theClass) { + return instrumentation.isModifiableClass(theClass); + } + + @Override + public Class[] getAllLoadedClasses() { + return instrumentation.getAllLoadedClasses(); + } + + @Override + public Class[] getInitiatedClasses(ClassLoader loader) { + return instrumentation.getInitiatedClasses(loader); + } + + @Override + public long getObjectSize(Object objectToSize) { + return instrumentation.getObjectSize(objectToSize); + } + + @Override + public void appendToBootstrapClassLoaderSearch(JarFile jarfile) { + synchronized (lockForAppend) { + appendToBootstrapClassLoaderSearch(jarfile); + } + } + + @Override + public void appendToSystemClassLoaderSearch(JarFile jarfile) { + synchronized (lockForAppend) { + appendToSystemClassLoaderSearch(jarfile); + } + } + + @Override + public boolean isNativeMethodPrefixSupported() { + return instrumentation.isNativeMethodPrefixSupported(); + } + + @Override + public void setNativeMethodPrefix(ClassFileTransformer transformer, String prefix) { + instrumentation.setNativeMethodPrefix(transformer, prefix); + } +} diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java index 0261eaa..c3ccdce 100644 --- a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java +++ b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java @@ -34,7 +34,7 @@ public class PluginManagerImpl implements PluginManager { private ClassLoader parentClassLoader = PluginManagerImpl.class.getClassLoader(); private List plugins = new ArrayList(); - private Instrumentation instrumentation; + private InstrumentationWrapper instrumentation; private ComponentManager componentManager; @@ -51,7 +51,7 @@ public PluginManagerImpl(Instrumentation instrumentation, ComponentManager compo public PluginManagerImpl(Instrumentation instrumentation, ComponentManager componentManager, Properties properties, URL scanPluginLocation, List extPluginLocations) { - this.instrumentation = instrumentation; + this.instrumentation = new InstrumentationWrapper(instrumentation); this.componentManager = componentManager; this.properties = properties; this.scanPluginLocations.add(scanPluginLocation); From 8038d09f79065de0cd85f129b4751b9020c5b94c Mon Sep 17 00:00:00 2001 From: luyanbo Date: Fri, 17 Jun 2022 16:25:25 +0800 Subject: [PATCH 2/6] prevent parallel appendToSystemClassLoaderSearch v2 --- .../java/com/alibaba/oneagent/plugin/PluginManagerImpl.java | 4 ++-- .../src/main/java/com/alibaba/oneagent/BootstrapAgent.java | 3 +++ .../com/alibaba/oneagent/inst}/InstrumentationWrapper.java | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) rename {one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin => one-java-agent/src/main/java/com/alibaba/oneagent/inst}/InstrumentationWrapper.java (93%) diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java index c3ccdce..0261eaa 100644 --- a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java +++ b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java @@ -34,7 +34,7 @@ public class PluginManagerImpl implements PluginManager { private ClassLoader parentClassLoader = PluginManagerImpl.class.getClassLoader(); private List plugins = new ArrayList(); - private InstrumentationWrapper instrumentation; + private Instrumentation instrumentation; private ComponentManager componentManager; @@ -51,7 +51,7 @@ public PluginManagerImpl(Instrumentation instrumentation, ComponentManager compo public PluginManagerImpl(Instrumentation instrumentation, ComponentManager componentManager, Properties properties, URL scanPluginLocation, List extPluginLocations) { - this.instrumentation = new InstrumentationWrapper(instrumentation); + this.instrumentation = instrumentation; this.componentManager = componentManager; this.properties = properties; this.scanPluginLocations.add(scanPluginLocation); diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java index 5127466..a588d88 100644 --- a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java @@ -1,5 +1,7 @@ package com.alibaba.oneagent; +import com.alibaba.oneagent.inst.InstrumentationWrapper; + import java.lang.instrument.Instrumentation; /** @@ -28,6 +30,7 @@ public static void destroy() { } private static synchronized void main(String args, Instrumentation inst, boolean premain) { + inst = new InstrumentationWrapper(inst); if (NopAgent.INSTANCE == AGENT) { Agent agent = new AgentImpl(); agent.init(args, inst, premain); diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java similarity index 93% rename from one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java rename to one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java index 75a5c52..2e187db 100644 --- a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/InstrumentationWrapper.java +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java @@ -1,4 +1,4 @@ -package com.alibaba.oneagent.plugin; +package com.alibaba.oneagent.inst; import java.lang.instrument.ClassDefinition; import java.lang.instrument.ClassFileTransformer; @@ -73,14 +73,14 @@ public long getObjectSize(Object objectToSize) { @Override public void appendToBootstrapClassLoaderSearch(JarFile jarfile) { synchronized (lockForAppend) { - appendToBootstrapClassLoaderSearch(jarfile); + instrumentation.appendToBootstrapClassLoaderSearch(jarfile); } } @Override public void appendToSystemClassLoaderSearch(JarFile jarfile) { synchronized (lockForAppend) { - appendToSystemClassLoaderSearch(jarfile); + instrumentation.appendToSystemClassLoaderSearch(jarfile); } } From 269790556de396422a877b0648b8a57076e65c90 Mon Sep 17 00:00:00 2001 From: luyanbo Date: Fri, 27 May 2022 15:50:45 +0800 Subject: [PATCH 3/6] update fastjson to 1.2.83 --- fastjson-demo-plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastjson-demo-plugin/pom.xml b/fastjson-demo-plugin/pom.xml index bc21a1a..62f9e48 100644 --- a/fastjson-demo-plugin/pom.xml +++ b/fastjson-demo-plugin/pom.xml @@ -23,7 +23,7 @@ com.alibaba fastjson - 1.2.76 + 1.2.83 From e16f2aa175a69c09d80d677a49842ef7347f5e0f Mon Sep 17 00:00:00 2001 From: luyanbo Date: Fri, 17 Jun 2022 17:18:22 +0800 Subject: [PATCH 4/6] setDaemon true --- .../java/com/alibaba/oneagent/plugin/PluginManagerImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java index 0261eaa..e2b85e2 100644 --- a/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java +++ b/one-java-agent-plugin/src/main/java/com/alibaba/oneagent/plugin/PluginManagerImpl.java @@ -275,6 +275,7 @@ public void run() { } } }, "oneagent plugin " + plugin.name() + " init"); + thread.setDaemon(true); thread.start(); } @@ -340,6 +341,7 @@ public void run() { } } }, "oneagent plugin " + plugin.name() + " start"); + thread.setDaemon(true); thread.start(); } From 4acecf934cb9d9d10e3795e53b4dba765acf240d Mon Sep 17 00:00:00 2001 From: luyanbo Date: Tue, 21 Jun 2022 20:37:39 +0800 Subject: [PATCH 5/6] fix for Java 9+ --- .../com/alibaba/oneagent/BootstrapAgent.java | 2 +- .../InstrumentationInvocationHandler.java | 28 ++++++ .../oneagent/inst/InstrumentationWrapper.java | 99 ++----------------- 3 files changed, 37 insertions(+), 92 deletions(-) create mode 100644 one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java index a588d88..e2c10ed 100644 --- a/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/BootstrapAgent.java @@ -30,7 +30,7 @@ public static void destroy() { } private static synchronized void main(String args, Instrumentation inst, boolean premain) { - inst = new InstrumentationWrapper(inst); + inst = InstrumentationWrapper.newInstrumentationWrapper(inst); if (NopAgent.INSTANCE == AGENT) { Agent agent = new AgentImpl(); agent.init(args, inst, premain); diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java new file mode 100644 index 0000000..a3e4e21 --- /dev/null +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationInvocationHandler.java @@ -0,0 +1,28 @@ +package com.alibaba.oneagent.inst; + +import java.lang.instrument.Instrumentation; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class InstrumentationInvocationHandler implements InvocationHandler { + private final Instrumentation instrumentation; + + private final Object lockForAppend = new Object(); + + public InstrumentationInvocationHandler(Instrumentation instrumentation) { + this.instrumentation = instrumentation; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (method.getName().equals("appendToBootstrapClassLoaderSearch") || + method.getName().equals("appendToSystemClassLoaderSearch") + ) { + synchronized (lockForAppend) { + return method.invoke(instrumentation, args); + } + } else { + return method.invoke(instrumentation, args); + } + } +} diff --git a/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java index 2e187db..66cd513 100644 --- a/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java +++ b/one-java-agent/src/main/java/com/alibaba/oneagent/inst/InstrumentationWrapper.java @@ -1,96 +1,13 @@ package com.alibaba.oneagent.inst; -import java.lang.instrument.ClassDefinition; -import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; -import java.lang.instrument.UnmodifiableClassException; -import java.util.jar.JarFile; - -public class InstrumentationWrapper implements Instrumentation{ - private final Instrumentation instrumentation; - - private final Object lockForAppend = new Object(); - - public InstrumentationWrapper(Instrumentation instrumentation) { - this.instrumentation = instrumentation; - } - - @Override - public void addTransformer(ClassFileTransformer transformer, boolean canRetransform) { - instrumentation.addTransformer(transformer, canRetransform); - } - - @Override - public void addTransformer(ClassFileTransformer transformer) { - instrumentation.addTransformer(transformer); - } - - @Override - public boolean removeTransformer(ClassFileTransformer transformer) { - return instrumentation.removeTransformer(transformer); - } - - @Override - public boolean isRetransformClassesSupported() { - return instrumentation.isRetransformClassesSupported(); - } - - @Override - public void retransformClasses(Class... classes) throws UnmodifiableClassException { - instrumentation.retransformClasses(classes); - } - - @Override - public boolean isRedefineClassesSupported() { - return instrumentation.isRedefineClassesSupported(); - } - - @Override - public void redefineClasses(ClassDefinition... definitions) throws ClassNotFoundException, UnmodifiableClassException { - instrumentation.redefineClasses(definitions); - } - - @Override - public boolean isModifiableClass(Class theClass) { - return instrumentation.isModifiableClass(theClass); - } - - @Override - public Class[] getAllLoadedClasses() { - return instrumentation.getAllLoadedClasses(); - } - - @Override - public Class[] getInitiatedClasses(ClassLoader loader) { - return instrumentation.getInitiatedClasses(loader); - } - - @Override - public long getObjectSize(Object objectToSize) { - return instrumentation.getObjectSize(objectToSize); - } - - @Override - public void appendToBootstrapClassLoaderSearch(JarFile jarfile) { - synchronized (lockForAppend) { - instrumentation.appendToBootstrapClassLoaderSearch(jarfile); - } - } - - @Override - public void appendToSystemClassLoaderSearch(JarFile jarfile) { - synchronized (lockForAppend) { - instrumentation.appendToSystemClassLoaderSearch(jarfile); - } - } - - @Override - public boolean isNativeMethodPrefixSupported() { - return instrumentation.isNativeMethodPrefixSupported(); - } - - @Override - public void setNativeMethodPrefix(ClassFileTransformer transformer, String prefix) { - instrumentation.setNativeMethodPrefix(transformer, prefix); +import java.lang.reflect.Proxy; + +public class InstrumentationWrapper { + public static Instrumentation newInstrumentationWrapper(Instrumentation instrumentation) { + return (Instrumentation) Proxy.newProxyInstance( + instrumentation.getClass().getClassLoader(), + new Class[]{Instrumentation.class}, + new InstrumentationInvocationHandler(instrumentation)); } } From 1e8353fa8a43a03b298debe11a4374c05101cf26 Mon Sep 17 00:00:00 2001 From: luyanbo Date: Tue, 21 Jun 2022 20:55:38 +0800 Subject: [PATCH 6/6] use jdk lts --- .github/workflows/test.yaml | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 673d691..03f2166 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -7,33 +7,17 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [7, 8, 9, 10, 11 ] + java: [7, 8, 11, 17 ] steps: - uses: actions/checkout@v2 - - name: Setup java - uses: actions/setup-java@v1 - with: - java-version: ${{ matrix.java }} - - name: Build with Maven - run: | - mvn clean package -DskipTests - mvn test - - build_jdk_ge_12: - runs-on: ubuntu-latest - strategy: - matrix: - java: [12, 13, 14, 15] - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 11 uses: actions/setup-java@v1 with: - java-version: 8 - - name: save java8 home + java-version: 11 + - name: save java11 home run: | - export JAVA8_HOME=$JAVA_HOME && echo $JAVA8_HOME - echo "export JAVA8_HOME=$JAVA_HOME" > ~/.testenv + export JAVA11_HOME=$JAVA_HOME && echo $JAVA11_HOME + echo "export JAVA11_HOME=$JAVA_HOME" > ~/.testenv - name: Setup java uses: actions/setup-java@v1 @@ -42,5 +26,5 @@ jobs: - name: Build with Maven run: | source ~/.testenv - mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA8_HOME/bin/javac clean package -DskipTests - mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA8_HOME/bin/javac test \ No newline at end of file + mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA11_HOME/bin/javac clean package -DskipTests --batch-mode + mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=$JAVA11_HOME/bin/javac test --batch-mode \ No newline at end of file