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);
.
.

上記の静的呼び出しは、何度も呼び出されるため、パフォーマンスの問題を引き起こしています。最適化するために、オブジェクトをキャッシュし、同じクラスにゲッターメソッドを追加して使用しようとしました。上記のコードは、以下のコードに置き換えられました。

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 を読んだ後、org.objectweb.asm.Type でない限り、Object 型 (getDescriptor は Object を返しますが、getMethodName および getDescriptor は文字列を返します) のものを直接使用することはできないことに気付きました。 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 は負荷定数の略です。クラスを (再) 作成するときに既知の定数にのみ使用できます。

さらに、特定のタイプの定数 (int、long、float、double、string、class、methodhandles、および methodtypes) にのみ使用できます。また、定数文字列は 64kb に制限されています。

最後に、値が本当に定数である場合、JVM はとにかくこのようなものを最適化する必要があるため、これはおそらく違いはありません。これが実際に問題であることを確認するためにプロファイリングしましたか?

于 2013-09-30T13:45:54.370 に答える