New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于ASM COMPUTE_FRAMES COMPUTE_MAXS的讨论 #89
Comments
private byte[] getBytes(ClassLoader loader,
String className,
byte[] classFileBuffer) {
ClassReader cr = new ClassReader(classFileBuffer);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS) {
@Override
protected ClassLoader getClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
};
ClassVisitor cv = new ProfilingClassAdapter(cw, className);
cr.accept(cv, ClassReader.EXPAND_FRAMES);
return cw.toByteArray();
} 采用线程本地类加载器后,自测在 tomcat 8.5 上可以监控 tomcat 本身和内部类 此处的改动就限制死了加载的class文件必须是使用 jdk 1.7 以上版本编译过的 see: https://www.java67.com/2020/04/javalangverifyerror-expecting-stack-map.html |
现在 MyPerf4J 只支持 1.7 及其之上的版本,这个改动的影响面比较大,你测试了哪些场景? 这块代码逻辑兼容了 PlainJava、Tomcat、SpringBoot、Flink 等场景,如果你的解决方案同样适用这些场景的话,欢迎提交 PR |
前三者没问题,Flink 没环境测。。。 |
这种写法你是在哪儿看到的?当年我写这段代码的时候对于使用 COMPUTE_MAXS 还是 COMPUTE_FRAMES 还是比较困惑的 |
有想法、运气不错;不过,你这个改动得进行全面的测试才行 |
翻了下文档,读的时候不需要计算,要不会有性能损耗,写的时候才重新计算 private byte[] getBytes(ClassLoader loader,
String className,
byte[] classFileBuffer) {
ClassReader cr = new ClassReader(classFileBuffer);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES) {
@Override
protected ClassLoader getClassLoader() {
return Thread.currentThread().getContextClassLoader();
}
};
ClassVisitor cv = new ProfilingClassAdapter(cw, className);
cr.accept(cv, ClassReader.SKIP_FRAMES);
return cw.toByteArray();
} |
这是跟其它的 agent 冲突了吧,我本地用 jdk20 起了一个 springboot2.7.8 的 demo 没问题 |
出现了个这问题😓
|
ThreadMXBean 里面不是有现成的方法可以获取到数据么,为啥要反射呢? |
不是 |
注意看:module java.base does not "opens java.lang" to unnamed module |
性能差,线程数很多时会影响应用 |
有复现的 demo 么,图里也看不出啥来,或者加载的那个类有啥特别的 |
从代码上看没什么特别的:
|
你试试这个方案:
|
那说明 B extends A ? 要么类库出现了多个版本了 |
B 不会继承 A 否则编译都通不过;还是类加载的问题 |
-XX:+TraceClassLoading 看下没 agent 的时候和有 agent 的时候那个类是从哪加载的。。。剩下我能想到的就只有那个类所在的类库出现了多个版本了,最好提供个 demo 吧😢 |
@JiaRG
以这个为 v1:
那么,在没有 MyPerf4J 和 有 MyPerf4J v0.1 与 v1 的版本在添加了 -XX:+TraceClassLoading 参数后的日志(做了脱敏与过滤)为: 你可以看到有问题的 v1 版本的类加载与另外两个明显不同,v1 版本里 MqttWireMessage 加载了 2 次 |
@JiaRG 这个 v0.1 的版本,你试了么? |
问题描述
目前源码中假如检测到类名和方法名中存在 $ 符号就会跳过注入
MyPerf4J/MyPerf4J-Base/src/main/java/cn/myperf4j/base/config/ProfilingFilter.java
Lines 87 to 97 in 4c0a98d
MyPerf4J/MyPerf4J-Base/src/main/java/cn/myperf4j/base/config/ProfilingFilter.java
Lines 182 to 190 in 4c0a98d
The text was updated successfully, but these errors were encountered: