<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

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

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

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

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

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

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

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

    而通過(guò)“類(lèi)引用”來(lái)調(diào)用一個(gè)方法的時(shí)候,直接通過(guò)偏移量就可以找到要調(diào)用的方法的位置了。【因?yàn)樽宇?lèi)中的方法的偏移量跟父類(lèi)中的偏移量是一致的】

    所以,通過(guò)接口引用調(diào)用方法會(huì)比類(lèi)引用慢一些。

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

    interface A{void say();}

    class B implements A{}

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

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

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

    符號(hào)引用:

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



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

    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 符號(hào)引用:

    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 閱讀(1896) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): JVM
    主站蜘蛛池模板: 全部在线播放免费毛片| 亚洲av中文无码字幕色不卡 | 亚洲制服丝袜精品久久| 午夜理伦剧场免费| 亚洲午夜久久久精品影院| 久久免费观看国产精品88av| 久久精品亚洲综合专区| 国产午夜无码精品免费看 | 蜜臀98精品国产免费观看| 亚洲人成网站影音先锋播放| 午夜免费啪视频在线观看 | 1000部啪啪未满十八勿入免费| 亚洲毛片在线观看| 0588影视手机免费看片| 亚洲va在线va天堂成人| 四虎影视免费在线| 国产成人亚洲精品电影| 久久久久亚洲AV综合波多野结衣 | 一本久久A久久免费精品不卡| 在线亚洲午夜理论AV大片| 久久国产乱子伦精品免费强| 亚洲色图视频在线观看| 成年女人免费视频播放体验区| 成人精品国产亚洲欧洲| 亚洲一级特黄大片在线观看| 国产精品免费看久久久| 亚洲AV成人噜噜无码网站| 日韩毛片免费在线观看| 精品人妻系列无码人妻免费视频| 青青草原精品国产亚洲av| 黄色成人网站免费无码av| 九一在线完整视频免费观看 | 亚洲av日韩av天堂影片精品| 亚洲天堂免费在线| 四虎影视在线看免费观看| 亚洲第一精品在线视频| 精品剧情v国产在免费线观看| 中文字幕一区二区三区免费视频| 亚洲人成毛片线播放| 亚洲人成色7777在线观看不卡| 免费无遮挡无码永久视频|