Change Dir

          先知cd——熱愛生活是一切藝術(shù)的開始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          JVM學(xué)習(xí)筆記(0)——JVM一把抓

          從畢業(yè)的時(shí)候斷斷續(xù)續(xù)讀這本書,發(fā)現(xiàn)已經(jīng)很久了,一直只是到概念層次,沒有深入細(xì)節(jié)。今天重讀這本書,希望能從中獲取更多。

          今天先開個(gè)頭。筆記是無結(jié)構(gòu)的流式記錄,類似tips的list吧~

          1. 每個(gè)java程序運(yùn)行于自己的JVM實(shí)例中,java程序的啟動(dòng)入口必須是public static void main(String[] args);
          2. 每個(gè)java程序,開始于main,結(jié)束于所有非守護(hù)線程的終止;
          3. jvm的體系結(jié)構(gòu)包含:類裝載器子系統(tǒng)(裝載class)、運(yùn)行時(shí)數(shù)據(jù)區(qū)(存放數(shù)據(jù))、執(zhí)行引擎(執(zhí)行被裝載類的指令);
          4. 運(yùn)行時(shí)數(shù)據(jù)區(qū)包含:堆、方法區(qū)、java棧、本地方法棧、PC寄存器。其中堆和方法區(qū)是所有線程共享的,而其他三者是線程獨(dú)享的;
          5. jvm數(shù)據(jù)類型分兩種:基本類型{數(shù)值類型{浮點(diǎn)數(shù){float,double},整數(shù){byte,short,int,long,char}},boolean,returnAddress}和引用類型{引用{類,接口,數(shù)組}},基本類型存數(shù)據(jù)本身,引用類型存數(shù)據(jù)引用;
          6. boolean是個(gè)特別的類型,jvm處理按int來操作,0為false,非0為true,boolean數(shù)組是按byte數(shù)組來訪問的;
          7. 引用類型中,類和接口都是對(duì)類或者實(shí)現(xiàn)了接口的類的實(shí)例的引用,數(shù)組是對(duì)數(shù)組對(duì)象的引用,一個(gè)特殊引用是null,表示沒有引用任何對(duì)象;
          8. 數(shù)據(jù)類型取值范圍:{byte:1字節(jié)有符號(hào),short:2字節(jié)有符號(hào),int:4字節(jié)有符號(hào),long:8字節(jié)有符號(hào),char:2字節(jié)無符號(hào),float:4字節(jié)IEEE754單精度,double:8字節(jié)IEEE754雙精度,returnAddress:統(tǒng)一方法中某操作碼的地址,reference:堆中對(duì)象的引用或null}
          9. JVM數(shù)據(jù)單元是字,字長(zhǎng)的設(shè)計(jì)最短要32bit即4個(gè)字節(jié),保證能容納byte,short,int,char,float,returnAddress和reference類型的值;
          10. JVM有兩種類加載器:?jiǎn)?dòng)類裝載器和用戶自定義類裝載器,前者是jvm實(shí)現(xiàn)的一部分,后者是java程序的一部分,不同類裝載器裝載的類被放在虛擬機(jī)內(nèi)部不同的命名空間;
          11. 方法區(qū)存儲(chǔ):{類加載時(shí),讀入class文件后,解析得到的類型信息:全限定名,直接父類的全限定名,是類類型還是接口類型,訪問修飾符,直接實(shí)現(xiàn)接口的全限定名有序列表},{常量池:直接常量(string,int等)和對(duì)其他類型、字段和方法的符號(hào)引用},{字段信息:字段名,字段類型,字段修飾符},{方法信息:方法名,方法返回類型,方法參數(shù)的數(shù)量和類型,方法的修飾符},{類變量:static},{編譯時(shí)常量:final},{指向ClassLoader的引用:如果是自定義裝載的},{指向Class類的引用:Class.forName()或者object.getClass()},{方法表:虛擬機(jī)為每個(gè)非抽象類生成一個(gè)方法表};
          12. 堆存儲(chǔ):所有運(yùn)行時(shí)創(chuàng)建的類實(shí)例或數(shù)組都放到同一個(gè)堆中;
          13. 程序計(jì)數(shù)器:大小1個(gè)字長(zhǎng),內(nèi)容總是下一條將被執(zhí)行指令的地址;
          14. java棧:只有push和pop操作,單位是一個(gè)棧幀,保存線程的運(yùn)行狀態(tài),每個(gè)幀中存儲(chǔ)當(dāng)前的參數(shù)、局部變量、中間運(yùn)算結(jié)果等。當(dāng)方法以return或者異常拋出結(jié)束時(shí),當(dāng)前幀pop,當(dāng)調(diào)用一個(gè)java方法時(shí),push一個(gè)幀成為當(dāng)前幀。因?yàn)閖ava棧數(shù)據(jù)是每線程私有的,可以不考慮同步問題。java棧的每個(gè)棧幀又包含三部分:局部變量區(qū)、操作數(shù)棧和幀數(shù)據(jù)區(qū)。局部變量和方法參數(shù)存入局部變量區(qū),操作數(shù)棧是jvm的工作區(qū),指令都要經(jīng)過棧彈出數(shù)據(jù)進(jìn)行運(yùn)算,一般的iload,istore等指令就是push和pop;幀數(shù)據(jù)區(qū)主要是支持常量池解析、正常方法返回以及異常派發(fā)機(jī)制;
          15. 本地方法棧:線程調(diào)用一個(gè)本地方法時(shí),本地方法接口使用本地方法棧;
          16. 執(zhí)行引擎:執(zhí)行指令,通用技術(shù)有解釋、即時(shí)編譯、自適應(yīng)優(yōu)化和芯片級(jí)執(zhí)行,Sun的hotspot使用自適應(yīng)優(yōu)化:剛開始對(duì)所有代碼解釋運(yùn)行,監(jiān)視代碼運(yùn)行情況,把經(jīng)常執(zhí)行的代碼編譯為本地代碼,優(yōu)化,然后繼續(xù)執(zhí)行。

          posted on 2012-09-07 14:57 changedi 閱讀(458) 評(píng)論(0)  編輯  收藏 所屬分類: Java技術(shù)

          主站蜘蛛池模板: 阿拉善左旗| 乌苏市| 许昌县| 二连浩特市| 改则县| 花莲县| 盘山县| 柳河县| 宜丰县| 沂源县| 温州市| 玉屏| 青海省| 南宁市| 穆棱市| 临城县| 平昌县| 平潭县| 麻江县| 大安市| 枣庄市| 朝阳区| 什邡市| 句容市| 三台县| 酒泉市| 涞水县| 壶关县| 东辽县| 榆树市| 建湖县| 黎川县| 盱眙县| 靖江市| 甘南县| 买车| 遵义县| 柘荣县| 芜湖县| 广平县| 城步|