jvm 虛擬機技術(一)

jvm的發展:

         HotSpot VM(sun公司)以前使用最廣泛的  ,邊編譯邊運行,熱點數據/多次運行的會翻譯成二進制保存本地。

         JRocket(bea)號稱最快的jvm   ,啓動後把字節碼文件編譯成二進制文件,運行,運行速度快,但是啓動慢

         J9 VM(IBM)

        Oracle 收購這兩家,發佈新版本,目前HotSpot是使用最廣泛的Jvm.

jvm的作用:

          內存分配和垃圾回收

jvm 內存模型:

         包括:  堆 方法區  虛擬機棧  本地方法棧  程序計數器等

         1.堆   大部分new出來的對象/反射 等都是放在該區域。堆中內存進一步分爲 新生代(新生代包括了eden區和                                             survival(from)/survival(to))和老年代;

          eden區域和兩個survival區默認比值爲8:1:1,因爲java中只有小部分對象能夠存活,比例小於2%或10%,

       2 方法區,在jdk 1.7以前稱爲永久代,是在堆中分配空間,jdk1.8以後成爲元空間,最大區別就是,元空間大小受限制與內                    存 大小。方法區保存 類信息  常量  靜態變量 JIT即時編譯器編譯後的代碼等

        這兩部分是線程共享區域

      3 程序計數器 ,jvm中唯一不會發生OOM,指向當前線程的指令位置或者class行號。因爲java天生多線程,涉及到線程切                     換,爲了確保多線程環境下程序正常執行。

     4虛擬機棧 ,有棧的特點,FILO先進後出,存放當前線程的數據/指令/返回地址。默認-Xss1M .

             每個方法在使用時候創建棧幀,每個棧幀中包括了

              a 局部變量表,存放8大基本數據類型和reference引用

              b 操作數棧  對方法的調用,出棧入棧

              c  動態鏈接  方法的多態

               d 返回地址  方法返回地址

     5 本地方法棧   保存的native方法,在調用本地方法時候,不會創建棧幀,在動態鏈接中直接調用。程序計數器也不保存行號

     HotSpot把本地方法棧和虛擬機棧合二爲一,其中在jvm中3.4.5三個是線程私有的,隨着線程產生和銷燬。

GC

     gc主要針對堆中來講,其中包括了垃圾回收算法

    1.  複製算法,使用在新生代中,當eden區內存不夠時候或者空間分配擔保,會發起mirror GC。存活對象進入survival區域,在 from 和 to兩個區域來回複製。速度快,內存空間連續,但是空間利用率低。新生代中的對象90%是朝生夕死,所以只有10%存活下來。

    2 標記清除算法  產生空間隨便,速度相對1要低。

    3 標記整理算法  速度比2低

 

垃圾回收器:

  

  單線程 d多線程 t特點
新生代 serial 

par new 

parallel scavenge 

G1
老年代 serial old 

cms

parallel old

               

各種垃圾回收器特點
       
新生代

serial

複製算法 單線程

par  new 

 

parallel scavenge

複製算法 並行多線程收集器
老年代 serial  old 標記整理 單線程
cms 標記清除 併發和並行收集器
paralle old 標記整理 並行多線程收集器
  G1  跨越新生代和老年代 化整爲零 標記整理 並行和併發收集器

 

cms垃圾回收器:佔用cpu資源,浮動垃圾/內存碎片

1 初始標記  用戶線程暫停,時間短,主要爲了查找gcRoots

2併發標記   用戶線程和GC線程同時運行,時間長

3重新標記   用戶線程暫停,時間短

4併發清理   用戶線程和gc線程同時運行,時間長

 

G1 垃圾回收器:空間整合,不會產生垃圾碎片。可預測的停頓

                   gc模式:yong gc    mixed gc

  1.初始標記  主要爲了查找gcRoots

2並發表及

3最終標記

4 回收

 

垃圾回收的對象:

    1.引用計數法 

2可達性分析     gcRoots

Java, 可作爲GC Roots的對象包括:

1.方法區中類靜態屬性引用的對象

2.方法區中常量引用的對象

3.虛擬機棧(本地變量表)中引用的對象。

本地方法棧JNI(Native方法)中引用的對象

  

                      

       

     

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章