Java基礎強化——JVM模型

JVM內存模型

JVM:運行時數據區域(線程共享和非共享的)

在這裏插入圖片描述

線程共享的:堆區,方法區

非線程共享的:程序計數器,Java虛擬機棧,本地方法棧

  • 堆區:存放對象實例,分配內存。新生代(Eden,From Survivor,To Survivor),老年代;堆大小=新生代+老年代。其中堆大小可以通過參數-Xms(堆的最小指)、-Xmx(堆的最大值)來設置。(注:-Xss 棧容量)(新生代:老年代=1:2,Eden:From:To Survivor = 8:1:1)
  • 方法區:方用於存儲已被虛擬機加載的類信息、常量、靜態變量;(常量池)
  • 程序計數器:(標記程序指令的執行)用來標誌當前線程所執行的字節碼的行號指示器,字節碼解釋器通過改變這個計數器上的值來選取下一條需要執行的字節碼指令。
  • java虛擬機棧:每個方法被執行的時候都會創建一個棧幀用於存儲局部變量表(方法參數、局部變量和對象引用類型)、操作數棧(操作棧,方法進行參數傳遞)、動態連接(每個棧幀都包含一個執行運行時常量池中該棧幀所屬方法的引用)、方法出口(方法出口分爲兩種, 一種收到返回命令,正常退出;第二種執行遇到異常導致方法退出)等。(編譯時確定)
  • 本地方法棧:虛擬機棧爲執行Java方法(字節碼)服務,而本地方法棧則是爲虛擬機使用到的Native方法服務。
  • 內存泄漏:StackOverflowError,OutOfMemoryError
  • 垃圾回收:主要回收的是堆區的資源(回收對象/方法區—判斷對象是否可回收—回收算法)
  • 對象是否存活:(1)引用記數法(對每次引用進行記數,但無法避免相互引用),(2)引用鏈可達性分析,以“GC Roots”的對象作爲起始點向下搜索,如果一個對象沒有任何引用鏈相連時,則該對象可以回收。GC Roots(各種可能的對象)
  • 垃圾回收算法:標記—清除法(碎片問題),複製算法(兩塊內存區域,複製存活對象,交換),標記—壓縮算法(標記存活對象壓縮到內存空間一端)。
  • 分代收集: 新生代使用複製算法:將Eden和一個(From)Survival的存活對象全部放入到另一個(To)Survival空間中,最後清理掉剛剛的Eden和Survival空間(當Survival空間不夠時,由老年代進行內存分配擔保)。老年代採用標記-刪除,或者標記-整理算法。
  • 類加載機制:虛擬機把表示類的class文件加載到內存,經過校驗、轉換解析、初始化,最終形成可以被虛擬機直接使用的java類型,這就是虛擬機的類加載機制.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章