少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          JVM在裝載class文件的時(shí)候,會有一步是將符號引用解析為直接引用的過程。

          那么這里的直接引用到底是什么呢?

          對于指向“類型”【Class對象】、類變量、類方法的直接引用可能是指向方法區(qū)的本地指針

          指向?qū)嵗兞俊?shí)例方法的直接引用都是偏移量實(shí)例變量的直接引用可能是從對象的映像開始算起到這個(gè)實(shí)例變量位置的偏移量實(shí)例方法的直接引用可能是方法表的偏移量

          在《深入java虛擬機(jī)》書的第197頁我們可以看到,子類中方法表的偏移量和父類中的方法表的偏移量是一致的。比如說父類中有一個(gè)say()方法的偏移量是7,那么子類中say方法的偏移量也是7。

          書中第199頁說,通過“接口引用”來調(diào)用一個(gè)方法,jvm必須搜索對象的類的方法表才能找到一個(gè)合適的方法。這是因?yàn)?span style="background-color: #ffccff;">實(shí)現(xiàn)同一個(gè)接口的這些類中,不一定所有的接口中的方法在類方法區(qū)中的偏移量都是一樣的。他們有可能會不一樣。這樣的話可能就要搜索方法表才能確認(rèn)要調(diào)用的方法在哪里。

          而通過“類引用”來調(diào)用一個(gè)方法的時(shí)候,直接通過偏移量就可以找到要調(diào)用的方法的位置了。【因?yàn)樽宇愔械姆椒ǖ钠屏扛割愔械钠屏渴且恢碌摹?/span>

          所以,通過接口引用調(diào)用方法會比類引用慢一些。

          下面介紹下什么是接口引用。

          interface A{void say();}

          class B implements A{}

          class C{public static void main(String []s){A a=new B();a.say()}}

          在上面的第三行代碼中,就是用“接口引用”來調(diào)用方法。

          --------------------------------------------------------------------

          符號引用:

          符號引用是一個(gè)字符串,它給出了被引用的內(nèi)容的名字并且可能會包含一些其他關(guān)于這個(gè)被引用項(xiàng)的信息——這些信息必須足以唯一的識別一個(gè)類、字段、方法。這樣,對于其他類的符號引用必須給出類的全名。對于其他類的字段,必須給出類名、字段名以及字段描述符。對于其他類的方法的引用必須給出類名、方法名以及方法的描述符。



          總結(jié):JVM對于直接引用和符號引用的處理是有區(qū)別的,可以看到符號引用時(shí),JVM將使用StringBuilder來完成字符串的  添加,而直接引用時(shí)則直接使用String來完成;直接引用永遠(yuǎn)比符號引用效率更快,但實(shí)際應(yīng)用開發(fā)中不可能全用直接引用,要提高效能可以考慮按虛擬機(jī)的思維來編寫你的程序。

          1.0 直接引用:

          public class StringAndStringBuilder{
             public static void main(String[] args){    
                 System.out.println ("s=" + "asdfa");
             }
          }

          反編譯后的:

          F:\java\res\字節(jié)碼>javap -c StringAndStringBuilder
          Compiled from "StringAndStringBuilder.java"
          public class StringAndStringBuilder extends java.lang.Object{
          public StringAndStringBuilder();
            Code:
             0:   aload_0
             1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
             4:   return

          public static void main(java.lang.String[]);
            Code:
             0:   ldc     #2; //String asdfa
             2:   astore_1
             3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
             6:   ldc     #4; //String s=asdfa
             8:   invokevirtual   #5; //Method java/io/PrintStream.println:(Ljava/lang/Str
          ing;)V
             11:  return

          }

           

          2.0 符號引用:

          public class StringAndStringBuilder{
             public static void main(String[] args){    
                String s="asdfa";
                  System.out.println ("s=" + s);
             }
          }

          反編譯后的:

          F:\java\res\字節(jié)碼>javap -c StringAndStringBuilder
          Compiled from "StringAndStringBuilder.java"
          public class StringAndStringBuilder extends java.lang.Object{
          public StringAndStringBuilder();
            Code:
             0:   aload_0
             1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
             4:   return

          public static void main(java.lang.String[]);
            Code:
             0:   ldc     #2; //String asdfa
             2:   astore_1
             3:   getstatic       #3; //Field java/lang/System.out:Ljava/io/PrintStream;
             6:   new     #4; //class java/lang/StringBuilder
             9:   dup
             10:  invokespecial   #5; //Method java/lang/StringBuilder."<init>":()V
             13:  ldc     #6; //String s=
             15:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
          String;)Ljava/lang/StringBuilder;
             18:  aload_1
             19:  invokevirtual   #7; //Method java/lang/StringBuilder.append:(Ljava/lang/
          String;)Ljava/lang/StringBuilder;
             22:  invokevirtual   #8; //Method java/lang/StringBuilder.toString:()Ljava/la
          ng/String;
             25:  invokevirtual   #9; //Method java/io/PrintStream.println:(Ljava/lang/Str
          ing;)V
             28:  return

          }


          posted on 2014-12-16 20:14 abin 閱讀(1892) 評論(0)  編輯  收藏 所屬分類: JVM
          主站蜘蛛池模板: 利川市| 绍兴市| 岑巩县| 长寿区| 宁强县| 嘉义县| 祁阳县| 宝应县| 沂南县| 玛沁县| 鄱阳县| 乌拉特前旗| 南投县| 宁武县| 都兰县| 澄城县| 宕昌县| 景宁| 长汀县| 公主岭市| 海阳市| 贵溪市| 阿拉善左旗| 临潭县| 宜宾县| 苍南县| 西畴县| 梧州市| 隆尧县| 隆回县| 教育| 尉氏县| 墨竹工卡县| 泰安市| 昌黎县| 仙居县| 德安县| 平乐县| 靖西县| 房产| 平定县|