alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

java 17 使用agent启动报错 #399

Closed dongshuke closed 2 years ago

dongshuke commented 2 years ago
Exception in thread "main" java.lang.ClassCircularityError: java/util/concurrent/ConcurrentHashMap$ForwardingNode
    at java.base/java.util.concurrent.ConcurrentHashMap.transfer(ConcurrentHashMap.java:2441)
    at java.base/java.util.concurrent.ConcurrentHashMap.addCount(ConcurrentHashMap.java:2354)
    at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1075)
    at java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
    at java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:666)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:651)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:435)
    at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:503)
*** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at t:\workspace\open\src\java.instrument\share\native\libinstrument\JPLISAgent.c line: 422
FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed

使用 8 与 11 可以正常启动

wuwen5 commented 2 years ago

jdk17一直包含在持续集成中,且是成功的。

我本地用java17测试也正常,没法复现你的异常。

建议提供更多信息,如jvm启动参数详细信息,javaagent启动参数配置。

oldratlee commented 2 years ago

建议提供更多信息,如jvm启动参数详细信息,javaagent启动参数配置。

尽量给出完整的信息,尤其是运行出错相关信息、完整的异常栈。 @dongshuke


类循环加载ClassCircularityErrorJava Agent实现方式的顽疾😖虽然出现的概率低)和业务运行逻辑代码相关,剥离复现比较麻烦。

解决方法(workaroud)可以是: @dongshuke @wuwen5

相关的 issue:


这边发个版本,再加一些 workaroud 的逻辑。

dongshuke commented 2 years ago

手动添加 jvm 启动参数 -javaagent:C:/application/development/maven/repository/com/alibaba/transmittable-thread-local/2.12.6/transmittable-thread-local-2.12.6.jar

IDEA生成启动参数:

非debug:

C:\application\development\jdk\jdk-17.0.2\bin\java.exe
-javaagent:C:/application/development/maven/repository/com/alibaba/transmittable-thread-local/2.12.6/transmittable-thread-local-2.12.6.jar
"-javaagent:C:\application\development\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar=62134:C:\application\development\JetBrains\IntelliJ IDEA 2021.2.3\bin"
-Dfile.encoding=UTF-8
-classpath
C:\application\development\projects\idea\练习\nacos-dubbo\consumer-1\target\test-classes;
C:\application\development\projects\idea\练习\nacos-dubbo\consumer-1\target\classes;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-dubbo\2021.1\spring-cloud-starter-dubbo-2021.1.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.1.1\spring-cloud-openfeign-core-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.4\spring-boot-autoconfigure-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot\2.6.4\spring-boot-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-aop\2.6.4\spring-boot-starter-aop-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\spring-aop\5.3.16\spring-aop-5.3.16.jar;
C:\application\development\maven\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;
C:\application\development\maven\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;
C:\application\development\maven\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;
C:\application\development\maven\repository\commons-fileupload\commons-fileupload\1.4\commons-fileupload-1.4.jar;
C:\application\development\maven\repository\commons-io\commons-io\2.2\commons-io-2.2.jar;
C:\application\development\maven\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo\3.0.6\dubbo-3.0.6.jar;
C:\application\development\maven\repository\com\alibaba\spring\spring-context-support\1.0.11\spring-context-support-1.0.11.jar;
C:\application\development\maven\repository\org\javassist\javassist\3.28.0-GA\javassist-3.28.0-GA.jar;
C:\application\development\maven\repository\com\google\code\gson\gson\2.8.9\gson-2.8.9.jar;
C:\application\development\maven\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;
C:\application\development\maven\repository\com\alibaba\fastjson\1.2.70\fastjson-1.2.70.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-starter\3.0.6\dubbo-spring-boot-starter-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-autoconfigure\3.0.6\dubbo-spring-boot-autoconfigure-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-autoconfigure-compatible\3.0.6\dubbo-spring-boot-autoconfigure-compatible-3.0.6.jar;
C:\application\development\maven\repository\io\netty\netty-all\4.1.74.Final\netty-all-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-buffer\4.1.74.Final\netty-buffer-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec\4.1.74.Final\netty-codec-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-dns\4.1.74.Final\netty-codec-dns-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-haproxy\4.1.74.Final\netty-codec-haproxy-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-http\4.1.74.Final\netty-codec-http-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-http2\4.1.74.Final\netty-codec-http2-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-memcache\4.1.74.Final\netty-codec-memcache-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-mqtt\4.1.74.Final\netty-codec-mqtt-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-redis\4.1.74.Final\netty-codec-redis-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-smtp\4.1.74.Final\netty-codec-smtp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-socks\4.1.74.Final\netty-codec-socks-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-stomp\4.1.74.Final\netty-codec-stomp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-xml\4.1.74.Final\netty-codec-xml-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-common\4.1.74.Final\netty-common-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-handler\4.1.74.Final\netty-handler-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-tcnative-classes\2.0.48.Final\netty-tcnative-classes-2.0.48.Final.jar;
C:\application\development\maven\repository\io\netty\netty-handler-proxy\4.1.74.Final\netty-handler-proxy-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver\4.1.74.Final\netty-resolver-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns\4.1.74.Final\netty-resolver-dns-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport\4.1.74.Final\netty-transport-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-rxtx\4.1.74.Final\netty-transport-rxtx-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-sctp\4.1.74.Final\netty-transport-sctp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-udt\4.1.74.Final\netty-transport-udt-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-classes-epoll\4.1.74.Final\netty-transport-classes-epoll-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-unix-common\4.1.74.Final\netty-transport-native-unix-common-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-classes-kqueue\4.1.74.Final\netty-transport-classes-kqueue-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-classes-macos\4.1.74.Final\netty-resolver-dns-classes-macos-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-epoll\4.1.74.Final\netty-transport-native-epoll-4.1.74.Final-linux-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-epoll\4.1.74.Final\netty-transport-native-epoll-4.1.74.Final-linux-aarch_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-kqueue\4.1.74.Final\netty-transport-native-kqueue-4.1.74.Final-osx-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-kqueue\4.1.74.Final\netty-transport-native-kqueue-4.1.74.Final-osx-aarch_64.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-native-macos\4.1.74.Final\netty-resolver-dns-native-macos-4.1.74.Final-osx-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-native-macos\4.1.74.Final\netty-resolver-dns-native-macos-4.1.74.Final-osx-aarch_64.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-jaxrs2\11.8\feign-jaxrs2-11.8.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-core\11.8\feign-core-11.8.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-jaxrs\11.8\feign-jaxrs-11.8.jar;
C:\application\development\maven\repository\javax\ws\rs\javax.ws.rs-api\2.1.1\javax.ws.rs-api-2.1.1.jar;
C:\application\development\projects\idea\练习\nacos-dubbo\common\target\classes;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2021.1\spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2021.1\spring-cloud-alibaba-commons-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\nacos\nacos-client\2.0.4\nacos-client-2.0.4.jar;
C:\application\development\maven\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-core\2.13.1\jackson-core-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-databind\2.13.1\jackson-databind-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.1\jackson-annotations-2.13.1.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpcore\4.4.15\httpcore-4.4.15.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpcore-nio\4.4.15\httpcore-nio-4.4.15.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;
C:\application\development\maven\repository\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;
C:\application\development\maven\repository\com\google\guava\guava\20.0\guava-20.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient\0.12.0\simpleclient-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_otel\0.12.0\simpleclient_tracer_otel-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_common\0.12.0\simpleclient_tracer_common-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_otel_agent\0.12.0\simpleclient_tracer_otel_agent-0.12.0.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-commons\3.1.1\spring-cloud-commons-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\security\spring-security-crypto\5.6.2\spring-security-crypto-5.6.2.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-context\3.1.1\spring-cloud-context-3.1.1.jar;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2021.1\spring-cloud-starter-alibaba-nacos-config-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\transmittable-thread-local\2.12.6\transmittable-thread-local-2.12.6.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-web\2.6.4\spring-boot-starter-web-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter\2.6.4\spring-boot-starter-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-logging\2.6.4\spring-boot-starter-logging-2.6.4.jar;
C:\application\development\maven\repository\ch\qos\logback\logback-classic\1.2.10\logback-classic-1.2.10.jar;
C:\application\development\maven\repository\ch\qos\logback\logback-core\1.2.10\logback-core-1.2.10.jar;
C:\application\development\maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.1\log4j-to-slf4j-2.17.1.jar;
C:\application\development\maven\repository\org\apache\logging\log4j\log4j-api\2.17.1\log4j-api-2.17.1.jar;
C:\application\development\maven\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;
C:\application\development\maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;
C:\application\development\maven\repository\org\springframework\spring-core\5.3.16\spring-core-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-jcl\5.3.16\spring-jcl-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-json\2.6.4\spring-boot-starter-json-2.6.4.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.1\jackson-datatype-jdk8-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.1\jackson-datatype-jsr310-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.1\jackson-module-parameter-names-2.13.1.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.4\spring-boot-starter-tomcat-2.6.4.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.58\tomcat-embed-core-9.0.58.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.58\tomcat-embed-el-9.0.58.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.58\tomcat-embed-websocket-9.0.58.jar;
C:\application\development\maven\repository\org\springframework\spring-web\5.3.16\spring-web-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-beans\5.3.16\spring-beans-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-webmvc\5.3.16\spring-webmvc-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-context\5.3.16\spring-context-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-expression\5.3.16\spring-expression-5.3.16.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-actuator\3.0.6\dubbo-spring-boot-actuator-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-actuator-compatible\3.0.6\dubbo-spring-boot-actuator-compatible-3.0.6.jar;
C:\application\development\maven\repository\cn\hutool\hutool-all\5.8.3\hutool-all-5.8.3.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-starter-bootstrap\3.1.1\spring-cloud-starter-bootstrap-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-starter\3.1.1\spring-cloud-starter-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;
C:\application\development\maven\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;
C:\application\development\maven\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar
com.xiao.pang.Main

debug:

C:\application\development\jdk\jdk-17.0.2\bin\java.exe
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:62897,suspend=y,server=n
-javaagent:C:/application/development/maven/repository/com/alibaba/transmittable-thread-local/2.12.6/transmittable-thread-local-2.12.6.jar
-javaagent:C:\Users\86583\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar
-Dfile.encoding=UTF-8
-classpath
"C:\application\development\projects\idea\练习\nacos-dubbo\consumer-1\target\test-classes;
C:\application\development\projects\idea\练习\nacos-dubbo\consumer-1\target\classes;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-dubbo\2021.1\spring-cloud-starter-dubbo-2021.1.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-openfeign-core\3.1.1\spring-cloud-openfeign-core-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-autoconfigure\2.6.4\spring-boot-autoconfigure-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot\2.6.4\spring-boot-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-aop\2.6.4\spring-boot-starter-aop-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\spring-aop\5.3.16\spring-aop-5.3.16.jar;
C:\application\development\maven\repository\org\aspectj\aspectjweaver\1.9.7\aspectjweaver-1.9.7.jar;
C:\application\development\maven\repository\io\github\openfeign\form\feign-form-spring\3.8.0\feign-form-spring-3.8.0.jar;
C:\application\development\maven\repository\io\github\openfeign\form\feign-form\3.8.0\feign-form-3.8.0.jar;
C:\application\development\maven\repository\commons-fileupload\commons-fileupload\1.4\commons-fileupload-1.4.jar;
C:\application\development\maven\repository\commons-io\commons-io\2.2\commons-io-2.2.jar;
C:\application\development\maven\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo\3.0.6\dubbo-3.0.6.jar;
C:\application\development\maven\repository\com\alibaba\spring\spring-context-support\1.0.11\spring-context-support-1.0.11.jar;
C:\application\development\maven\repository\org\javassist\javassist\3.28.0-GA\javassist-3.28.0-GA.jar;
C:\application\development\maven\repository\com\google\code\gson\gson\2.8.9\gson-2.8.9.jar;
C:\application\development\maven\repository\org\yaml\snakeyaml\1.29\snakeyaml-1.29.jar;
C:\application\development\maven\repository\com\alibaba\fastjson\1.2.70\fastjson-1.2.70.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-starter\3.0.6\dubbo-spring-boot-starter-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-autoconfigure\3.0.6\dubbo-spring-boot-autoconfigure-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-autoconfigure-compatible\3.0.6\dubbo-spring-boot-autoconfigure-compatible-3.0.6.jar;
C:\application\development\maven\repository\io\netty\netty-all\4.1.74.Final\netty-all-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-buffer\4.1.74.Final\netty-buffer-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec\4.1.74.Final\netty-codec-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-dns\4.1.74.Final\netty-codec-dns-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-haproxy\4.1.74.Final\netty-codec-haproxy-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-http\4.1.74.Final\netty-codec-http-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-http2\4.1.74.Final\netty-codec-http2-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-memcache\4.1.74.Final\netty-codec-memcache-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-mqtt\4.1.74.Final\netty-codec-mqtt-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-redis\4.1.74.Final\netty-codec-redis-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-smtp\4.1.74.Final\netty-codec-smtp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-socks\4.1.74.Final\netty-codec-socks-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-stomp\4.1.74.Final\netty-codec-stomp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-codec-xml\4.1.74.Final\netty-codec-xml-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-common\4.1.74.Final\netty-common-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-handler\4.1.74.Final\netty-handler-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-tcnative-classes\2.0.48.Final\netty-tcnative-classes-2.0.48.Final.jar;
C:\application\development\maven\repository\io\netty\netty-handler-proxy\4.1.74.Final\netty-handler-proxy-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver\4.1.74.Final\netty-resolver-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns\4.1.74.Final\netty-resolver-dns-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport\4.1.74.Final\netty-transport-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-rxtx\4.1.74.Final\netty-transport-rxtx-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-sctp\4.1.74.Final\netty-transport-sctp-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-udt\4.1.74.Final\netty-transport-udt-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-classes-epoll\4.1.74.Final\netty-transport-classes-epoll-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-unix-common\4.1.74.Final\netty-transport-native-unix-common-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-classes-kqueue\4.1.74.Final\netty-transport-classes-kqueue-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-classes-macos\4.1.74.Final\netty-resolver-dns-classes-macos-4.1.74.Final.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-epoll\4.1.74.Final\netty-transport-native-epoll-4.1.74.Final-linux-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-epoll\4.1.74.Final\netty-transport-native-epoll-4.1.74.Final-linux-aarch_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-kqueue\4.1.74.Final\netty-transport-native-kqueue-4.1.74.Final-osx-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-transport-native-kqueue\4.1.74.Final\netty-transport-native-kqueue-4.1.74.Final-osx-aarch_64.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-native-macos\4.1.74.Final\netty-resolver-dns-native-macos-4.1.74.Final-osx-x86_64.jar;
C:\application\development\maven\repository\io\netty\netty-resolver-dns-native-macos\4.1.74.Final\netty-resolver-dns-native-macos-4.1.74.Final-osx-aarch_64.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-jaxrs2\11.8\feign-jaxrs2-11.8.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-core\11.8\feign-core-11.8.jar;
C:\application\development\maven\repository\io\github\openfeign\feign-jaxrs\11.8\feign-jaxrs-11.8.jar;
C:\application\development\maven\repository\javax\ws\rs\javax.ws.rs-api\2.1.1\javax.ws.rs-api-2.1.1.jar;
C:\application\development\projects\idea\练习\nacos-dubbo\common\target\classes;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-discovery\2021.1\spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-alibaba-commons\2021.1\spring-cloud-alibaba-commons-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\nacos\nacos-client\2.0.4\nacos-client-2.0.4.jar;
C:\application\development\maven\repository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-core\2.13.1\jackson-core-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-databind\2.13.1\jackson-databind-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\core\jackson-annotations\2.13.1\jackson-annotations-2.13.1.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpasyncclient\4.1.5\httpasyncclient-4.1.5.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpcore\4.4.15\httpcore-4.4.15.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpcore-nio\4.4.15\httpcore-nio-4.4.15.jar;
C:\application\development\maven\repository\org\apache\httpcomponents\httpclient\4.5.13\httpclient-4.5.13.jar;
C:\application\development\maven\repository\org\reflections\reflections\0.9.11\reflections-0.9.11.jar;
C:\application\development\maven\repository\com\google\guava\guava\20.0\guava-20.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient\0.12.0\simpleclient-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_otel\0.12.0\simpleclient_tracer_otel-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_common\0.12.0\simpleclient_tracer_common-0.12.0.jar;
C:\application\development\maven\repository\io\prometheus\simpleclient_tracer_otel_agent\0.12.0\simpleclient_tracer_otel_agent-0.12.0.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-commons\3.1.1\spring-cloud-commons-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\security\spring-security-crypto\5.6.2\spring-security-crypto-5.6.2.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-context\3.1.1\spring-cloud-context-3.1.1.jar;
C:\application\development\maven\repository\com\alibaba\cloud\spring-cloud-starter-alibaba-nacos-config\2021.1\spring-cloud-starter-alibaba-nacos-config-2021.1.jar;
C:\application\development\maven\repository\com\alibaba\transmittable-thread-local\2.12.6\transmittable-thread-local-2.12.6.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-web\2.6.4\spring-boot-starter-web-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter\2.6.4\spring-boot-starter-2.6.4.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-logging\2.6.4\spring-boot-starter-logging-2.6.4.jar;
C:\application\development\maven\repository\ch\qos\logback\logback-classic\1.2.10\logback-classic-1.2.10.jar;
C:\application\development\maven\repository\ch\qos\logback\logback-core\1.2.10\logback-core-1.2.10.jar;
C:\application\development\maven\repository\org\apache\logging\log4j\log4j-to-slf4j\2.17.1\log4j-to-slf4j-2.17.1.jar;
C:\application\development\maven\repository\org\apache\logging\log4j\log4j-api\2.17.1\log4j-api-2.17.1.jar;
C:\application\development\maven\repository\org\slf4j\jul-to-slf4j\1.7.36\jul-to-slf4j-1.7.36.jar;
C:\application\development\maven\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;
C:\application\development\maven\repository\org\springframework\spring-core\5.3.16\spring-core-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-jcl\5.3.16\spring-jcl-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-json\2.6.4\spring-boot-starter-json-2.6.4.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.13.1\jackson-datatype-jdk8-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.13.1\jackson-datatype-jsr310-2.13.1.jar;
C:\application\development\maven\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.13.1\jackson-module-parameter-names-2.13.1.jar;
C:\application\development\maven\repository\org\springframework\boot\spring-boot-starter-tomcat\2.6.4\spring-boot-starter-tomcat-2.6.4.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.58\tomcat-embed-core-9.0.58.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.58\tomcat-embed-el-9.0.58.jar;
C:\application\development\maven\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.58\tomcat-embed-websocket-9.0.58.jar;
C:\application\development\maven\repository\org\springframework\spring-web\5.3.16\spring-web-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-beans\5.3.16\spring-beans-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-webmvc\5.3.16\spring-webmvc-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-context\5.3.16\spring-context-5.3.16.jar;
C:\application\development\maven\repository\org\springframework\spring-expression\5.3.16\spring-expression-5.3.16.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-actuator\3.0.6\dubbo-spring-boot-actuator-3.0.6.jar;
C:\application\development\maven\repository\org\apache\dubbo\dubbo-spring-boot-actuator-compatible\3.0.6\dubbo-spring-boot-actuator-compatible-3.0.6.jar;
C:\application\development\maven\repository\cn\hutool\hutool-all\5.8.3\hutool-all-5.8.3.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-starter-bootstrap\3.1.1\spring-cloud-starter-bootstrap-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\cloud\spring-cloud-starter\3.1.1\spring-cloud-starter-3.1.1.jar;
C:\application\development\maven\repository\org\springframework\security\spring-security-rsa\1.0.10.RELEASE\spring-security-rsa-1.0.10.RELEASE.jar;
C:\application\development\maven\repository\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;
C:\application\development\maven\repository\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;
C:\application\development\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar"
com.xiao.pang.Main

代码如下, 使用 debug 启动 100% 报错 非debug启动 正常

package com.xiao.pang;

import com.alibaba.ttl.TransmittableThreadLocal;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;

public class Main
{
    public static ThreadLocal<String> threadLocal = new TransmittableThreadLocal<>();
    public static ForkJoinPool executorService = new ForkJoinPool();

    public static void main(String[] args) {
        for (int i = 0; i < 4; i++) {
            int round = i;
            List<String> strings = Arrays.asList("a", "b", "c");

            threadLocal.set(i + "");

            executorService.submit(() -> {
                        strings.parallelStream().forEach(s -> show("in stream " + round, s));
                    }
            ).join();
        }
    }

    private static void show(String title, Object value) {
        System.out.printf("[%s] %-15s - value: %s, thread local value: %s%n",
                Thread.currentThread().getName(), title, value, threadLocal.get());
    }
oldratlee commented 2 years ago

具体看了一下:

  1. TTL Agentjava.util包(含ConcurrentHashMap$ForwardingNode)的跳过处理逻辑。
  2. 这个异常栈,是在加载Java Agent ClassInstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:435)),还没有进入(TTL) Agent的处理。

    Exception in thread "main" java.lang.ClassCircularityError: java/util/concurrent/ConcurrentHashMap$ForwardingNode
        at java.base/java.util.concurrent.ConcurrentHashMap.transfer(ConcurrentHashMap.java:2441)
        at java.base/java.util.concurrent.ConcurrentHashMap.addCount(ConcurrentHashMap.java:2354)
        at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1075)
        at java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
        at java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:666)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:651)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:435)
        at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:503)
    *** java.lang.instrument ASSERTION FAILED ***: "result" with message agent load/premain call failed at t:\workspace\open\src\java.instrument\share\native\libinstrument\JPLISAgent.c line: 422
    FATAL ERROR in native method: processing of -javaagent failed, processJavaStart failed

所以,看起来可能是JDK 17.0.2Bug。 @dongshuke @wuwen5


@dongshuke 从你上面说明,可以看出是在

才会出这个问题。在线上生产环境,不会有这个问题。

你用JDK 11/8来开发Debug吧,避免这些复杂混乱的情况(IDE 额外处理、可能JDK Bug)。应该也不会影响你的开发效率~ @dongshuke


PS: 你上面提供的复现方式,如此的复杂(超长的命令组装与环境准备),以至于其实只有你自己当前是可以运行起来的; 别人是不能以你给的方式运行起来的(并复现&排查问题)。🙃🙃 @dongshuke

dongshuke commented 2 years ago

好的 好的 谢谢

oldratlee commented 2 years ago

@dongshuke 这个 issue 先 close 了。 ❤️

如果发现 对开发或线上有实际影响的问题,可以 reopen。

wuwen5 commented 2 years ago

@dongshuke 你在使用IntelliJ IDEA DEBUG的时候可以加上=ttl.agent.logger:STDOUT试试

例如:-javaagent:C:/application/development/maven/repository/com/alibaba/transmittable-thread-local/2.12.6/transmittable-thread-local-2.12.6.jar=ttl.agent.logger:STDOUT

我使用IntelliJ IDEA DEBUG模式复现了,然而当加上=ttl.agent.logger:STDOUT它又好了,怀疑和类加载数量和顺序有某种关系,异常发生在ConcurrentHashMap扩容阶段加载内部类。


TTL Agent有java.util包(含ConcurrentHashMap$ForwardingNode)的跳过处理逻辑。

@oldratlee java.util 包应该并不包含ConcurrentHashMap$ForwardingNode的跳过处理逻辑,它在java.util.concurrent包 (如果我没理解错)。

我尝试加上 if (classFile.startsWith("java/util/concurrent/ConcurrentHashMap")) return NO_TRANSFORM; 测试就好了

对比了jdk11与jdk17 类加载日志,发现使用jdk11 时ConcurrentHashMap$ForwardingNode加载的时机远早于 ttl 的加载,而使用jdk17时,ConcurrentHashMap$ForwardingNode的加载正好处于 ttl 的doTransform阶段。

oldratlee commented 2 years ago

@dongshuke 你在使用IntelliJ IDEA DEBUG的时候可以加上=ttl.agent.logger:STDOUT试试

例如:-javaagent:C:/application/development/maven/repository/com/alibaba/transmittable-thread-local/2.12.6/transmittable-thread-local-2.12.6.jar=ttl.agent.logger:STDOUT

我使用IntelliJ IDEA DEBUG模式复现了,然而当加上=ttl.agent.logger:STDOUT它又好了,怀疑和类加载数量和顺序有某种关系,异常发生在ConcurrentHashMap扩容阶段加载内部类。


对比了jdk11与jdk17 类加载日志,发现使用jdk11 时ConcurrentHashMap$ForwardingNode加载的时机远早于 ttl 的加载,而使用jdk17时,ConcurrentHashMap$ForwardingNode的加载正好处于 ttl 的doTransform阶段。

@wuwen5 👍 666


@oldratlee java.util 包应该并不包含ConcurrentHashMap$ForwardingNode的跳过处理逻辑,它在java.util.concurrent

@wuwen5

你说的对;现在的实现有跳过java.util包的逻辑,但并没有包含 子包java.util.concurrent(如ConcurrentHashMap及其内部类)。 是可以加一下处理。能避免一些已经出现的问题 总是好的。

这个问题修复逻辑,你方便加一下提交? 😄 ❤️ PS: v2.x版本 在分支2.x上开发。

然后可以发个版本出来。


其实 TTL Agent不会有增强处理的 常用基础类(就像ConcurrentHashMap及其内部类), 是可以并应该 提前return NO_TRANSFORM掉,尽量安全的避免ClassCircularityError问题。

wuwen5 commented 2 years ago

@oldratlee

我建议ttl先不做修复处理,需更多验证,不排除与IDEA自身有关系

oldratlee commented 2 years ago
  • 但是仍然解释不通,因为即使不加跳过,ttl agent也并不会处理该类,与加跳过逻辑执行流程是一样的,仅仅只是提前 return NO_TRANSFORM

嗯嗯。『即使不加跳过,ttl agent也并不会处理该类』这个很奇怪,所以有怀疑是JDK Bug。 (当然 目前问题排查 可能还不够完整。)

我建议ttl先不做修复处理,需更多验证,不排除与IDEA自身有关系

好的,赞成。 👍 @wuwen5

我也赞成:对于排查还没有形成逻辑自洽的原因,则先不上 可能是在猜的修复

另一方面,目前这个问题没有实际的影响。

primitiveheart commented 1 year ago

现象:

Exception in thread "main" java.lang.ClassCircularityError: java/util/concurrent/ConcurrentHashMap$ForwardingNode
at java.base/java.util.concurrent.ConcurrentHashMap.transfer(ConcurrentHashMap.java:2441)
at java.base/java.util.concurrent.ConcurrentHashMap.addCount(ConcurrentHashMap.java:2354)
at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1075)
at java.base/java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1541)
at java.base/java.lang.ClassLoader.getClassLoadingLock(ClassLoader.java:666)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:651)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:435)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:503)

各位大佬有什么解法

oldratlee commented 1 year ago

发布了v2.14.3以解决这个问题: https://github.com/alibaba/transmittable-thread-local/releases/tag/v2.14.3

可以试一下,是否解决问题,测试验证结果麻烦回复一下 💕 @primitiveheart @dongshuke

dongshuke commented 1 year ago

发布了解决这个问题,可以试一下 v2.14.3 💕

https://github.com/alibaba/transmittable-thread-local/releases/tag/v2.14.3

666666