應(yīng)用,一定要應(yīng)用

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            25 Posts :: 0 Stories :: 118 Comments :: 0 Trackbacks

          2004-09-27

          第三章:jvm結(jié)構(gòu)
          3.1數(shù)據(jù)類型
          基本類型和引用類型
          基本值和引用值

          數(shù)據(jù)不需要做標(biāo)記或者可被檢查以確定類型。也就導(dǎo)致jvm的指令集是針對特定類型的值的。

          jvm包含對對象的顯式支持(引用類型)

          3.2基本類型和值
          基本類型--returnAddress類型(jvm指令的操作碼的指針,不是java類型)
          ?--數(shù)值類型--整型--byte
          ???--short
          ???--int
          ???--long
          ??? --浮點(diǎn)型--float
          ???? --double
          ???--char

          jvm中沒有boolean類型,java中的boolean類型的操作被翻譯為int類型進(jìn)行操作。


          問題:在數(shù)值類型中提及的NaN值對應(yīng)于java里的什么情況

          3.3引用類型和值
          有三種引用類型:類類型,接口類型,數(shù)組類型

          3.4字
          jvm中沒有指定數(shù)據(jù)類型的存儲(chǔ)器大小,只是指定了一個(gè)“字”的概念,一個(gè)字足以持有byte,int,char,short,float,returnAddress,refrence的值,兩個(gè)字足夠大持有double,long的值。

          一般來說,一個(gè)字的大小是主機(jī)平臺(tái)的一個(gè)指針的大小,32位機(jī)上,字是32位,64位機(jī)上,字是64位的,但這是實(shí)現(xiàn)決定的,而不是jvm規(guī)范決定的。

          3.5運(yùn)行期數(shù)據(jù)
          pc(程序計(jì)數(shù)器)寄存器:
          每個(gè)jvm線程有自己的pc寄存器,在任何點(diǎn),每個(gè)jvm線程執(zhí)行一個(gè)單個(gè)方法的 代碼,這個(gè)方法被稱為那個(gè)線程的當(dāng)前方法。如果方法是native,則pc寄存器的值沒有定義,如果不是,則pc寄存器中存放當(dāng)前正在執(zhí)行的jvm指令的地址。
          pc寄存器占一個(gè)字寬。

          棧:
          每個(gè)jvm線程都有私有的棧。等價(jià)于傳統(tǒng)語言的棧,它持有局部變量和部分結(jié)果。并參與部分方法的調(diào)用和返回。(由于java框架是可以堆分配的,所以java的棧的存儲(chǔ)空間可以是不連續(xù)的)
          java棧可以是固定大小或者是動(dòng)態(tài)的。jvm實(shí)現(xiàn)可以向程序員提供對java棧的初始大小以及動(dòng)態(tài)情況下的最大和最小值的控制。

          如果固定大小而且線程需要的棧大于棧的大小,則出現(xiàn)stackoverflowError
          如果動(dòng)態(tài)大小但存儲(chǔ)器沒有足夠空間,則出現(xiàn)outOfMemoryError

          Sun的jdk1.0.2版jvm實(shí)現(xiàn)中,java棧是不連續(xù)、動(dòng)態(tài)的,不收縮,在線程消亡時(shí)被回收。java棧的大小的限制可以在jvm啟動(dòng)時(shí)用“-oss”標(biāo)志設(shè)置。

          堆:
          java有一個(gè)所有線程共享的堆。堆是用于分配所有類實(shí)例和數(shù)組的運(yùn)行期數(shù)據(jù)區(qū)。
          堆在jvm啟動(dòng)時(shí)創(chuàng)建,由garbage collector回收。
          堆可以是固定的,也可以動(dòng)態(tài)擴(kuò)展,并且支持自動(dòng)收縮,存儲(chǔ)器無需連續(xù)。
          jvm實(shí)現(xiàn)可以向程序員提供堆初始大小以及動(dòng)態(tài)情況下的最大和最小值的控制。

          如果要求的堆比系統(tǒng)能夠擁有的堆大,則出現(xiàn)OutOfMemoryError

          Sun的jdk1.0.2中,堆是動(dòng)態(tài)的,從不收縮它的堆,它的初始值和最大值在啟動(dòng)時(shí)用“-ms”和“-mx”指定。

          方法區(qū):
          方法區(qū)類似于傳統(tǒng)語言中編譯后代碼的存儲(chǔ)區(qū),存儲(chǔ)每個(gè)類結(jié)構(gòu)例如:常數(shù)池、域、方法數(shù)據(jù)。
          方法區(qū)是虛擬機(jī)建立的時(shí)候啟動(dòng)的,邏輯上是垃圾回收實(shí)現(xiàn)的一部分,但可以不實(shí)現(xiàn)。
          方法區(qū)可以固定大小,可以動(dòng)態(tài),可以收縮,無需連續(xù)存儲(chǔ)器。
          jvm實(shí)現(xiàn)可以向程序員提供方法區(qū)初始大小以及動(dòng)態(tài)情況下的最大和最小值的控制。
          outofmemory異常

          sun的jdk1.0.2中,仿佛去是動(dòng)態(tài)的,不收縮的,不提供程序員對其最大最小值的控制。

          常數(shù)池:
          常數(shù)池是每個(gè)類或接口的constant_pool的運(yùn)行期表示。功能類似于傳統(tǒng)語言的符號(hào)表,但含更寬的數(shù)據(jù)范圍。(詳細(xì)見第五章)

          自身方法棧(估計(jì)應(yīng)該是native method stack)
          其管理和普通棧類似,每個(gè)線程一個(gè),線程創(chuàng)建時(shí)創(chuàng)建,只是使用非java的native語言(如C)寫成,以支持native方法。

          Sun的jdk1.0.2版jvm實(shí)現(xiàn)中,java棧是固定大小。java棧的大小的限制可以在jvm啟動(dòng)時(shí)用“-oss”標(biāo)志設(shè)置。

          3.6框架
          jvm frame用于存儲(chǔ)數(shù)據(jù)和部分結(jié)果,以及動(dòng)態(tài)鏈接,返回方法的值,和調(diào)度異常。

          每次java方法調(diào)用時(shí)創(chuàng)建一個(gè)新的框架,當(dāng)方法結(jié)束的時(shí)候,框架撤銷。框架從創(chuàng)建它的線程的棧里分配,每個(gè)框架有自己的局部變量集和操作數(shù)棧(這些可以一次分配,因?yàn)槎际蔷幾g期可知的)。
          對于一個(gè)給定線程的任何點(diǎn),只有一個(gè)活躍框架,稱為當(dāng)前框架,局部變量和操作數(shù)棧上的操作總是引用當(dāng)前框架。

          局部變量:
          每個(gè)jvm frame包含一組局部變量,局部變量總是一個(gè)字寬,long型,double型存為兩個(gè)局部變量。

          操作數(shù)棧:
          每個(gè)jvm frame包含一個(gè)操作數(shù)棧,絕大多數(shù)java操作從當(dāng)前操作數(shù)棧取值。

          動(dòng)態(tài)連接:
          jvm frame通過包含一個(gè)對當(dāng)前類的常數(shù)池的引用來達(dá)到動(dòng)態(tài)鏈接的目的,java 的class文件仍然可以使用符號(hào)引用訪問變量或方法。


          java中的i=i++從這一章來理解應(yīng)該是和框架(jvm frame)這個(gè)概念有關(guān),也就是++操作符被實(shí)現(xiàn)成為了一個(gè)方法,而不是一個(gè)虛擬機(jī)指令,這樣就可以解釋了,但是目前還沒有看到有++操作符應(yīng)該被實(shí)現(xiàn)為一個(gè)方法的說明,另外java的方法調(diào)用是值傳參的,這種情況應(yīng)該也不會(huì)出現(xiàn)值回寫的情況.
          看至3。6結(jié)束。

          3.7對象的表示
          jvm不對對象表示要求任何特殊的內(nèi)部結(jié)構(gòu)。
          在sun公司的jdk實(shí)現(xiàn)中,對象實(shí)例就是指向一個(gè)句柄的指針,而這個(gè)句柄本身又包括兩個(gè)指針:1、一個(gè)指向包含該對象方法而代表該對象類型的class對象的指針,2、另一個(gè)指向在java堆中為該對象實(shí)例分配的存儲(chǔ)區(qū)域。
          別的jvm實(shí)現(xiàn)可以采用諸如:直接插入高速緩存技術(shù),等。

          3.8特殊的初始化方法
          實(shí)例初始化:構(gòu)造函數(shù)作為具有特殊名字《init》的實(shí)例初始化方法出現(xiàn),方法的名字由編譯器提供,這個(gè)方法由jvm在內(nèi)部由invokespecial指令調(diào)用,只能使用于未初始化的實(shí)例上,不能被java程序員使用。
          類和接口的初始化:類和接口的初始化具有特殊的名字《cinit》,方法的名稱由編譯器提供,該方法由jvm顯示調(diào)用,從不直接被java代碼和jvm指令調(diào)用,只是作為類初始化進(jìn)程的一部分被間接的調(diào)用。

          3.9異常
          異常一層層向上拋,丟棄當(dāng)前層的操作數(shù)棧和局部變量,知道遇到catch為止,如果到頂層還沒有catch,當(dāng)前線程將被結(jié)束。

          3.10class文件格式
          class文件是平臺(tái)無關(guān)格式的二進(jìn)制文件,class文件格式精確定義了文件的內(nèi)容。

          3.11指令集概述
          一個(gè)jvm指令由一個(gè)字節(jié)的操作碼后跟0個(gè)或多個(gè)操作數(shù)構(gòu)成。操作數(shù)的數(shù)目由操作碼決定。
          當(dāng)操作數(shù)多于一個(gè)字節(jié)的時(shí)候,以高位字節(jié)在前的方式存儲(chǔ)。
          字節(jié)碼指令流只是單字節(jié)對齊的(除了tableswitch,和lookupswitch的特殊指令對操作數(shù)的特殊要求),放棄了數(shù)據(jù)對齊,反映了對數(shù)據(jù)緊湊性的偏好,而排除了可能提高jvm仿真器性能的某些實(shí)現(xiàn)技術(shù)。
          jvm指令中絕大多數(shù)是類型相關(guān)的,也就是作用于特定類型的操作數(shù)的。并在該指令的助記符中顯示的標(biāo)識(shí)出來。
          具體的指令集后面細(xì)說。

          3.12公共設(shè)計(jì)、私有實(shí)現(xiàn)
          公共概念:class文件格式和jvm指令集

          posted on 2006-08-24 17:01 flyffa 閱讀(1229) 評論(0)  編輯  收藏 所屬分類: 讀書
          主站蜘蛛池模板: 盐亭县| 当涂县| 贵德县| 双辽市| 东港市| 大渡口区| 资溪县| 罗平县| 长海县| 湖北省| 米泉市| 恭城| 龙陵县| 横山县| 富裕县| 胶州市| 新安县| 南昌县| 聂荣县| 柘城县| 应城市| 德清县| 法库县| 民和| 昌宁县| 上栗县| 三都| 南宁市| 齐齐哈尔市| 永济市| 凤冈县| 武宣县| 宜兰县| 滨州市| 班戈县| 阳曲县| 福建省| 安丘市| 宝兴县| 大宁县| 宝山区|