jvm

一.運行時數據區java

 

  1.線程共享和線程私有:程序員

    01.線程共享:算法

       堆,方法區數組

    02.線程私有:數據結構

       虛擬機棧,本地方法棧,程序計數器jvm

  2.程序計數器函數

    當前線程執行字節碼文件的行號指示器spa

    可以在線程切換以後,找到本身正確的位置線程

    是惟一一個不會致使內存泄漏(OutOfMemory,OOM)的區域翻譯

  3.虛擬機棧:

    基本數據類型的變量和對象的引用變量都存在此區域;

    遵循「先進後出,後進先出」

  StackOverFlowError:

    線程請求的棧深度大於了虛擬機規定的最大深度

  OutOfMemoryError:

    虛擬機在擴展棧時,沒法申請到足夠的內存空間!

 

  4.本地方法棧

    主要服務於Native修飾的方法

    在HotSport中虛擬機棧和本地方法棧合爲一體

 堆:

  全部對象的實例和數組開闢空間都在此區域保存!

  全部線程共享

  GC主要回收對象的區域

 1.堆分區:新生代,老年代,永久代

 2.方法區(靜態去)

   全部線程共享;

   方法(包含構造函數),接口 定義在此區域;

   全部方法的信息

   靜態變量+常量+類信息+方法信息+常量池 

 

 

二.類的生命週期:

  類的生命週期從類被加載,鏈接和初始化開始到類的卸載結束

   01.類的生命週期中,類的二進制位於方法區;

   02.在堆中會有一個描述這個類的Class對象;

  2.1加載將class字節碼文件內容加載到內存中,並將這些靜態數據轉換成方法區中運行時數據結構,在堆中生成一格Class對象;這個Class對象就是方法區類數據的訪問入口

  2.2連接

   0.1類的驗證

    001.類文件的結構檢查

    002.語義檢查 好比說final修飾的變量在編譯期間發現再次賦值

    003.字節碼驗證,確保字節碼能被jvm識別

   0.2類的準備

    爲類中全部static修飾的內容開闢空間,並賦予初始值!!

    static  int  num=100;

    這時候 num=0;

   0.3類的解析

    符號引用:就是用字符串的形式來表示某個變量或是類,咱們能看懂String a="a"; Student stu=new Student();

    直接引用:是根據符號引用翻譯出來的地址!

   2.3 初始化

    加載不是初始化

    初始化指的是實例化!建立出類的實例!

    初始化的時機

     01.類的主動引用

      001.new一個類的對象

      002.經過反射的newInstance();

      003.再初始化子類時候必須先初始化父類

     02.類的被動引用

      001.經過類名訪問靜態內容

      002.調用類的靜態常量也會不會初始化類

      003.用類做爲對象數組存在時,也不會初始化類

      004.子類調用父類的靜態變量不會加載子類的靜態代碼塊(不會執行類的準備階段)

 

JVM垃圾回首機制

一.垃圾回收機制(GC)
  1.1:爲啥須要垃圾回收機制
  01.只要是對象被建立,那麼就會在虛擬機的堆中開闢空間;
  02.程序運行過程當中會建立N個對象,美哥對象都會有本身的空間;
  03.若是每一個對象都永久的佔領這塊空間,顯然內存是不夠的

    總結:爲了保證其餘對象可以被正確的建立!!
  在C語言中,垃圾回收的任務是程序員自身負責的
  可能會出現的問題:
  01.因爲程序猿粗枝大葉,致使煤油及時釋放不使用的對象,釋放錯誤!
  02.程序猿一旦釋放了程序核心對象(好比說系統對象),系統崩潰!

  1.2:垃圾回收機制的定義
  在java程序運行過程當中,jvm有一個專門負責回收那些再也不使用的對象
  所佔的內存,這種回收的過程,咱們稱之爲垃圾回收機制(GC,Garbage Collection)
  1.3:垃圾回收機制的特色
  01.減輕了程序猿進行內存管理的負擔
  02.防止系統內存被非法釋放,使咱們的程序更加健壯
  03.只有在對象不被任何變量引用時,才能被回收
  04.程序沒法讓垃圾回收機制強行回收垃圾操做
  05.當垃圾回收機制將要回收不用的對象內存時,會先調用這個對象的finalize()
    這個方法可能使對象復活,致使垃圾回收器取消對該對象的回收。:
  1.4:對象的狀態
    在虛擬機的垃圾回收器來看,堆中全部的對象都有三種狀態!
  01.可觸及狀態
  02.可復活狀態
  03.不可觸及狀態
  直郵對向出於不可觸及狀態的時候,垃圾回收機制真正的釋放對象所佔有的內存

       1.對象的生命週期開始(new語句或者是反射值的newInstance)
  2.對象再也不被引用,或者對象調用了finalize()
  3.對象調用了finalize()
  4.垃圾回收
  5.對象生命週期結束 垃圾什麼時候被回收    
    01.對象沒有引用    
    02.程序在做用域正常執行完畢後    
    03.System.sxit();    
    04.程序意外終止  
  講解GC
  01.什麼時間======觸發GC條件      
    001.System.gc();      
    002.系統自身決定GC的觸發時機      
    003.根據eden區和feom space區打大小決定
  02.對什麼東西   
  Java中的對象====經過分析算法沒法找到的對象
  03.作了什麼   
    對搜到的對象進行復制操做   對搜索不到的對象執行finaize  若是真正的回收一個對象,至少須要兩次標記! 
01.第一次標記:對於一個沒有其餘對象引用的時候執行finalize()  
02.第二次標記:對於篩選過的對象,進行回收java的內存分配機制  
  核心:分代分配,分代回收 新生代  
    Eden區         :是連續的內存空間,因此分配的極快  
    survior區       :From To必須有一個區域是空的  
    老年代 :永久帶  
    注意事項:
  01.絕大多數建立的對象分配到Eden區是,可是大多數對象會在這個區域死亡
  02.當Eden區滿的時候,會執行Minor GC,將死亡的對象清除掉剩餘存活的對象會放到survior0區
  03.之後每次Eden滿的時候會執行Minor GC,全部存活的對象又被放進survivor0區
  04.當survivor0滿的時候會把存活的對象複製到survivor區,以後清空survivor0去
  05.反覆執行以後,任然活着的對象複製到老年代
  06.老年代的對象要比年輕代的大,固然也有滿的時候,這是就會執行Maior GC(Full GC)
  07.若是對象比較大,年輕代放不下直接放入老年代! 
    Yong  GC和FullGC的區別   
  01.Y GC是在新生代的Eden區滿,survivor區滿的時候觸發的       Full GC是在老年代滿的時候觸發的   
  02.YongGC執行效率高      
    Full GC執行速率低 何時觸發Full GC   
  01.執行System.gc(),系統建議執行Full GC單不是必須執行   
  02.老年代空間不足      
  001.當Yong  GC執行後存活的對象須要進駐到老年代,可是發現老年代空間不足      
  002.當Survivor0去Survivor1區來回切換時,發現內存不足,必須放進老年代。  
    03.方法區空間不足    
  GC涉及到的算法 
  引用計數法   給對象添加一個引用器,使用一次加一,少一個引用減一!  當引用爲0是進行回收  可是不能解決循環引用的問題根據搜索法對象根爲起點,向下延伸,延伸的路徑我           們稱之爲引用鏈(  )當一個對象沒有任何引用鏈時,證實這個對象是不可用對象(不可達到) 會被回收 什麼是根   
  01.在方法區中常量引用的對象   
  02.棧中引用的對象   
  03.靜態屬性引用的對象  複製算法圖解  解釋   就是講原有的空間,每次都是使用其中一塊   缺點就是浪費一半的空間!   不適合在對象存活多的狀況下使用   在新生代使用標記清除算法 圖解   解釋     
    001.吧全部存活的對象打個標記    
    002.把全部沒有標記的對象統一清除缺點  
  01.兩個過程效率都很慢,由於須要查詢  
  02.由於在清除的過程當中會產生內存碎片,如哥有打對象沒法存儲  標記整理算法圖解  解釋適合存活多的區域,因此適合在老年代使用!                   
相關文章
相關標籤/搜索