Java ASM 5.0.3 JSRInlinerAdapter可快速填充代码缓存内存
在使用ASM 5.0.3/java 1.7_80/Apache Tomcat-6.0.35检测java web应用程序时,我遇到了一个奇怪的问题 在服务器启动后的1或2天内,代码缓存内存将被完全填满100%,并且从不进行垃圾收集。在没有检测的情况下也可以验证这一点,检测工作正常&代码缓存永远不会填满100% 我在检测代码中使用了“JSRInlinerAdapter”。因为我的应用程序包含从48到51的所有类文件版本(1.4到1.7) 我的问题是-当JIT编译器编译这些方法时,代码缓存内存是否充满了内联方法?(因为我使用了JSRInlinerAdapter) 其他信息 我使用以下VM参数Java ASM 5.0.3 JSRInlinerAdapter可快速填充代码缓存内存,java,assembly,jvm,java-bytecode-asm,Java,Assembly,Jvm,Java Bytecode Asm,在使用ASM 5.0.3/java 1.7_80/Apache Tomcat-6.0.35检测java web应用程序时,我遇到了一个奇怪的问题 在服务器启动后的1或2天内,代码缓存内存将被完全填满100%,并且从不进行垃圾收集。在没有检测的情况下也可以验证这一点,检测工作正常&代码缓存永远不会填满100% 我在检测代码中使用了“JSRInlinerAdapter”。因为我的应用程序包含从48到51的所有类文件版本(1.4到1.7) 我的问题是-当JIT编译器编译这些方法时,代码缓存内存是否充满
-Djava.util.Arrays.useLegacyMergeSort=true
-XX:+UseCodeCacheFlushing
-Djsse.enableCBCProtection=false
-XX:NewSize=384m
-XX:MaxNewSize=384m
-XX:PermSize=384m
-XX:MaxPermSize=384m
-XX:+DisableExplicitGC
-XX:MaxGCPauseMillis=400
-XX:MaxGCMinorPauseMillis=100
-XX:+UseG1GC
-XX:+UnlockDiagnosticVMOptions
-XX:+G1SummarizeConcMark
-XX:+UseTLAB -XX:NewRatio=3
-XX:+UseCMSInitiatingOccupancyOnly
-XX:InitiatingHeapOccupancyPercent=30
-XX:ConcGCThreads=5
-XX:ParallelGCThreads=20
-XX:+UseFastAccessorMethods
-XX:+UseAdaptiveGCBoundary
-XX:+UseStringCache
-XX:+AggressiveOpts
-Xms1536m
-Xmx1536m
快速填充代码缓存的原因是什么?不要使用
-Djava.util.Arrays.useLegacyMergeSort=true
。如果比较器损坏,请修复该比较器。否则,您只修复了一个症状,但可能有任意数量的其他未被注意到的bug。除此之外,为什么要使用JSRInlinerAdapter?你的理由实际上没有解释任何事情。嗨,霍尔格,感谢你对java.util.Arrays.useLegacyMergeSort
的输入。使用JSRInlinerAdapter的另一个原因是,我的应用程序包含从版本48到51的类文件。我向类中的所有方法注入一些字节码(使用AdviceAdapter)以查找方法的执行时间。正如我所看到的,类文件版本<=49包含JSR/RET指令,这可能导致stackmap验证时出现任何问题。这就是使用“JSRInlinerAdapter”的原因。如果类文件的版本