1

我正在使用 ASM 注入代码并且到目前为止很幸运,在压力测试期间,我观察到我看到一些性能下降,因为我编写的代码正在进行大量静态调用,为了优化它,我尝试缓存变量我使用。在原始代码中,这就是我所做的

  visitor.visitLdcInsn(getMethodName());
  visitor.visitLdcInsn(getDescriptor());
  visitor.visitMethodInsn(Opcodes.INVOKESTATIC, MYTRACKER.HELPER_CLASS,     
          MYTrackingConstants.HELPER_GET_CLIENT_METHOD,MYTrackingConstants.HELPER_GET_CLIENT_METHOD_DESC);
.
.

上面的静态调用导致性能问题,因为它被调用的次数,为了优化它我缓存了对象并在同一个类中添加了一个getterm方法并尝试使用它,上面的代码现在被下面的代码替换了

visitor.visitLdcInsn(getRTTDescriptor());

但是当我跑步时,我得到了这个异常

      [err] java.lang.IllegalArgumentException: value com.vish.MyTransformDescriptor@63f463f4
      [err]     at org.objectweb.asm.ClassWriter.a(Unknown Source)
      [err]     at [internal classes]
      [err]     at  sun.instrument.TransformerManager.transform(TransformerManager.java:181)
      [err]     at  sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:377)
      [err]     at java.lang.ClassLoader.defineClassImpl(Native Method) 
      [err]     at java.lang.ClassLoader.defineClass(ClassLoader.java:275)

在阅读了 visitLdcInsn 的 javadoc 之后,我意识到我们不能直接使用 Object 类型的任何东西(getDescriptor 返回 Object,其中 getMethodName 和 getDescriptor 返回字符串),除非它是 org.objectweb.asm.Type 任何人都可以帮助我或提供示例如何使用 Type 加载我的对象的示例?

下面是我的代码片段

public RTMethodAdapter{
Object rttd;
public RTMethodAdapter(MethodVisitor visitor, MethodInfo mInfo, String reqOpsType, String classname,Object rttd, AnalyzerAdapter aa)
{
 . 
 .
 .
 this.rttd = rttd;
}

public Object getRTTDescriptor(){
    return rttd;
}
public String getMethodName() {
    return methodInfo.getMethodName();
}

public String getDescriptor() {
    return methodInfo.getDescriptor();
}
}

谢谢

维斯瓦纳特B

4

1 回答 1

1

Ldc 代表负载常数。您只能将它用于(重新)编写类时已知的常量。

此外,它只能用于特定类型的常量:整数、长整数、浮点数、双精度数、字符串、类、方法句柄和方法类型。并且常量字符串限制为 64kb。

最后,这可能不会有什么不同,因为如果值确实是一个常量,JVM 应该优化掉这样的事情。您是否进行了分析以确定这实际上是一个问题?

于 2013-09-30T13:45:54.370 回答