4

型名のようなものが.class ファイルcom.example.Dogにコンパイルされます。com/example/Dogほとんどの JVM はどのように最適化しますか? 長い型名 (またはメンバー名) には、より多くの文字列比較が必要なようです。

4

3 に答える 3

8

長い型 (クラスおよびインターフェイス) 名は、シンボル テーブルのスペースを占有します。Java 仮想マシン仕様の第 5 章で詳しく説明されているように、名前はリンク時に使用されます。このすべてのリンクが完了すると、リフレクションを使用していない限り、名前は実行時のパフォーマンスに影響しません。

于 2012-05-18T04:34:39.503 に答える
5

Javaコンパイラはバイトコードを生成します。文字列の比較はありません。

このクラスをjavapで確認し、バイトコードを確認してください。

たとえば、これ

class A extends java.lang.Object{
    static final boolean $assertionsDisabled;
    A();
    public static void main(java.lang.String[]);
    static {};
}

これを回します

class A extends java.lang.Object{
static final boolean $assertionsDisabled;

A();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   getstatic   #2; //Field $assertionsDisabled:Z
   3:   ifne    14
   6:   new #3; //class java/lang/AssertionError
   9:   dup
   10:  invokespecial   #4; //Method java/lang/AssertionError."<init>":()V
   13:  athrow
   14:  getstatic   #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  ldc #6; //String hi
   19:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   22:  return

static {};
  Code:
   0:   ldc_w   #8; //class A
   3:   invokevirtual   #9; //Method java/lang/Class.desiredAssertionStatus:()Z
   6:   ifne    13
   9:   iconst_1
   10:  goto    14
   13:  iconst_0
   14:  putstatic   #2; //Field $assertionsDisabled:Z
   17:  return

}

内部的には、jvmは数値IDを使用します。長い変数名と短い変数名に違いはありません。

編集:-l出力を追加

Compiled from "A.java"
class A extends java.lang.Object{
static final boolean $assertionsDisabled;

A();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

  LineNumberTable: 
   line 3: 0



public static void main(java.lang.String[]);
  Code:
   0:   getstatic   #2; //Field $assertionsDisabled:Z
   3:   ifne    14
   6:   new #3; //class java/lang/AssertionError
   9:   dup
   10:  invokespecial   #4; //Method java/lang/AssertionError."<init>":()V
   13:  athrow
   14:  getstatic   #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  ldc #6; //String hi
   19:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   22:  return

  LineNumberTable: 
   line 6: 0
   line 7: 14
   line 8: 22



static {};
  Code:
   0:   ldc_w   #8; //class A
   3:   invokevirtual   #9; //Method java/lang/Class.desiredAssertionStatus:()Z
   6:   ifne    13
   9:   iconst_1
   10:  goto    14
   13:  iconst_0
   14:  putstatic   #2; //Field $assertionsDisabled:Z
   17:  return

  LineNumberTable: 
   line 3: 0



}

-verbose-sを追加します

Compiled from "A.java"
class A extends java.lang.Object
  SourceFile: "A.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method   #10.#23;    //  java/lang/Object."<init>":()V
const #2 = Field    #8.#24; //  A.$assertionsDisabled:Z
const #3 = class    #25;    //  java/lang/AssertionError
const #4 = Method   #3.#23; //  java/lang/AssertionError."<init>":()V
const #5 = Field    #26.#27;    //  java/lang/System.out:Ljava/io/PrintStream;
const #6 = String   #28;    //  hi
const #7 = Method   #29.#30;    //  java/io/PrintStream.println:(Ljava/lang/String;)V
const #8 = class    #31;    //  A
const #9 = Method   #32.#33;    //  java/lang/Class.desiredAssertionStatus:()Z
const #10 = class   #34;    //  java/lang/Object
const #11 = Asciz   $assertionsDisabled;
const #12 = Asciz   Z;
const #13 = Asciz   <init>;
const #14 = Asciz   ()V;
const #15 = Asciz   Code;
const #16 = Asciz   LineNumberTable;
const #17 = Asciz   main;
const #18 = Asciz   ([Ljava/lang/String;)V;
const #19 = Asciz   StackMapTable;
const #20 = Asciz   <clinit>;
const #21 = Asciz   SourceFile;
const #22 = Asciz   A.java;
const #23 = NameAndType #13:#14;//  "<init>":()V
const #24 = NameAndType #11:#12;//  $assertionsDisabled:Z
const #25 = Asciz   java/lang/AssertionError;
const #26 = class   #35;    //  java/lang/System
const #27 = NameAndType #36:#37;//  out:Ljava/io/PrintStream;
const #28 = Asciz   hi;
const #29 = class   #38;    //  java/io/PrintStream
const #30 = NameAndType #39:#40;//  println:(Ljava/lang/String;)V
const #31 = Asciz   A;
const #32 = class   #41;    //  java/lang/Class
const #33 = NameAndType #42:#43;//  desiredAssertionStatus:()Z
const #34 = Asciz   java/lang/Object;
const #35 = Asciz   java/lang/System;
const #36 = Asciz   out;
const #37 = Asciz   Ljava/io/PrintStream;;
const #38 = Asciz   java/io/PrintStream;
const #39 = Asciz   println;
const #40 = Asciz   (Ljava/lang/String;)V;
const #41 = Asciz   java/lang/Class;
const #42 = Asciz   desiredAssertionStatus;
const #43 = Asciz   ()Z;

{
static final boolean $assertionsDisabled;
  Signature: Z


A();
  Signature: ()V
  LineNumberTable: 
   line 3: 0



  Code:
   Stack=1, Locals=1, Args_size=1
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return
  LineNumberTable: 
   line 3: 0


public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  LineNumberTable: 
   line 6: 0
   line 7: 14
   line 8: 22



  Code:
   Stack=2, Locals=1, Args_size=1
   0:   getstatic   #2; //Field $assertionsDisabled:Z
   3:   ifne    14
   6:   new #3; //class java/lang/AssertionError
   9:   dup
   10:  invokespecial   #4; //Method java/lang/AssertionError."<init>":()V
   13:  athrow
   14:  getstatic   #5; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  ldc #6; //String hi
   19:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   22:  return
  LineNumberTable: 
   line 6: 0
   line 7: 14
   line 8: 22

  StackMapTable: number_of_entries = 1
   frame_type = 14 /* same */


static {};
  Signature: ()V
  LineNumberTable: 
   line 3: 0



  Code:
   Stack=1, Locals=0, Args_size=0
   0:   ldc_w   #8; //class A
   3:   invokevirtual   #9; //Method java/lang/Class.desiredAssertionStatus:()Z
   6:   ifne    13
   9:   iconst_1
   10:  goto    14
   13:  iconst_0
   14:  putstatic   #2; //Field $assertionsDisabled:Z
   17:  return
  LineNumberTable: 
   line 3: 0

  StackMapTable: number_of_entries = 2
   frame_type = 13 /* same */
   frame_type = 64 /* same_locals_1_stack_item */
     stack = [ int ]


}
于 2012-05-18T04:28:56.320 に答える
1

これは、JITコンパイル時に実際の正確なメソッドを解決できるかどうかに部分的に依存します。可能であれば、コンパイルされたコードが単に関連するコードに分岐する可能性があります。たとえば、ファイナルメソッド呼び出しと非ファイナルメソッド呼び出しのこれらのタイミングで、ホットスポットがそうしている証拠を見ることができます。実際、特に最終的なメソッドのためのそのような最適化はありません(これは私が開発者の間で見つけた一般的な誤解です)。しかし、これらの図が示すように、最終的な方法であるかどうかにかかわらず、正確な方法を特定できる場合には最適化があります

正確なメソッドを特定できない場合、VMは少なくともメソッドシグネチャのハッシュコードを操作できるため、特定のメソッドの特定のバイトコードオフセットからの呼び出しに対してハッシュコードが1回計算されると、そのハッシュコードは計算されません。再度計算する必要があります。ホットスポットや他のJVMが実際にこれを実行するかどうかは確認していませんが、原則として、それはやみくもに明白なことのように思われます。

于 2012-05-18T05:10:28.207 に答える