成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java程序員必備基礎結構圖

開發 后端
最近看了深入理解Java虛擬機第三版,整理了一些基礎結構圖,算是比較全的了,做一下筆記,大家一起學習。

前言

最近看了深入理解Java虛擬機第三版,整理了一些基礎結構圖,算是比較全的了,做一下筆記,大家一起學習。

1.Java虛擬機運行時數據區圖

JVM內存結構是Java程序員必須掌握的基礎。

程序計數器

  •  程序計數器,可以看作當前線程所執行的字節碼的行號指示器
  •  它是線程私有的。

Java虛擬機棧

  •  線程私有的,生命周期與線程相同。
  •  每個方法被執行的時候都會創建一個"棧幀",用于存儲局部變量表(包括參數)、操作數棧、動態鏈接、方法出口等信息。
  •  局部變量表存放各種基本數據類型boolean、byte、char、short等

本地方法棧

  •  與虛擬機棧基本類似,區別在于虛擬機棧為虛擬機執行的java方法服務,而本地方法棧則是為Native方法服務。

Java堆

  •  Java堆是java虛擬機所管理的內存中最大的一塊內存區域,也是被各個線程共享的內存區域,在JVM啟動時創建。
  •  其大小通過-Xms和-Xmx參數設置,-Xms為JVM啟動時申請的最小內存,-Xmx為JVM可申請的最大內存。

方法區

  •  它用于存儲虛擬機加載的類信息、常量、靜態變量、是各個線程共享的內存區域。-可以通過-XX:PermSize 和 -XX:MaxPermSize 參數限制方法區的大小。

2. 堆的默認分配圖

  •  Java堆 = 老年代 + 新生代
  •  新生代 = Eden + S0 + S1
  •  新生代與老年代默認比例的值為 1:2 ,可以通過參數 –XX:NewRatio 配置。
  •  默認的,Eden : from : to = 8 : 1 : 1 ,可以通過參數–XX:SurvivorRatio 來設定

3.方法區結構圖

方法區是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯器編譯后的代碼緩存等數據。

4.對象的內存布局圖

一個Java對象在堆內存中包括對象頭、實例數據和補齊填充3個部分:

  •  對象頭包括Mark Word(存儲哈希碼,GC分代年齡等) 和 類型指針(對象指向它的類型元數據的指針),如果是數組對象,還有一個保存數組長度的空間
  •  實例數據是對象真正存儲的有效信息,包括了對象的所有成員變量,其大小由各個成員變量的大小共同決定。
  •  對齊填充不是必然存在的,僅僅起占位符的作用。

5.對象頭的Mark Word圖

  •  Mark Word 用于存儲對象自身的運行時數據,如哈希碼(HashCode)、GC分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等。
  •  在32位的HotSpot虛擬機中,如果對象處于未被鎖定的狀態下,那么Mark Word的32bit空間里的25位用于存儲對象哈希碼,4bit用于存儲對象分代年齡,2bit用于存儲鎖標志位,1bit固定為0,表示非偏向鎖。

6.對象與Monitor關聯結構圖

對象是如何跟monitor有關聯的呢?

一個Java對象在堆內存中包括對象頭,對象頭有Mark word,Mark word存儲著鎖狀態,鎖指針指向monitor地址。Synchronized的底層跟這相關哦~

7.Java Monitor的工作機理圖:

Java 線程同步底層就是監視鎖Monitor~,如下是Java Monitor的工作機理圖:

  •  想要獲取monitor的線程,首先會進入_EntryList隊列。
  •  當某個線程獲取到對象的monitor后,進入Owner區域,設置為當前線程,同時計數器count加1。
  •  如果線程調用了wait()方法,則會進入WaitSet隊列。它會釋放monitor鎖,即將owner賦值為null,count自減1,進入WaitSet隊列阻塞等待。
  •  如果其他線程調用 notify() / notifyAll() ,會喚醒WaitSet中的某個線程,該線程再次嘗試獲取monitor鎖,成功即進入Owner區域。
  •  同步方法執行完畢了,線程退出臨界區,會將monitor的owner設為null,并釋放監視鎖。

8.創建一個對象內存分配流程圖

  •  對象一般是在Eden區生成。
  •  如果Eden區填滿,就會觸發Young GC。
  •  觸發Young GC的時候,Eden區實現清除,沒有被引用的對象直接被清除。
  •  依然存活的對象,會被送到Survivor區,Survivor =S0+S1.
  •  每次Young GC時,存活的對象復制到未使用的那塊Survivor 區,當前正在使用的另外一塊Survivor 區完全清除,接著交換兩塊Survivor 區的使用狀態。
  •  如果Young GC要移送的對象大于Survivor區上限,對象直接進入老年代。
  •  一個對象不可能一直呆在新生代,如果它經過多次GC,依然活著,次數超過-XX:MaxTenuringThreshold的閥值,它直接進入老年代。簡言之就是,對象經歷多次滾滾長江,紅塵世事,終于成為長者(進入老年代)

9.可達性分析算法判定對象存活

可達性分析算法是用來判斷一個對象是否存活的~

算法的核心思想:

  •  通過一系列稱為“GC Roots”的對象作為起始點,從這些節點開始根據引用關系向下搜索,搜索走過的路徑稱為“引用鏈”,當一個對象到 GC Roots 沒有任何的引用鏈相連時(從 GC Roots 到這個對象不可達)時,證明此對象不可能再被使用。

10.標記-清除算法示意圖

  •  標記-清除算法是最基礎的垃圾收集算法。
  •  算法分為兩個階段,標記和清除。
  •  首先標記出需要回收的對象,標記完成后,統一回收掉被標記的對象。
  •  當然可以反過來,先標記存活的對象,統一回收未被標記的對象。
  •  標記-清除 兩個缺點是,執行效率不穩定和內存空間的碎片化問題~

11.標記-復制算法示意圖

  •  1969年 Fenichel提出“半區復制”,將內存容量劃分對等兩塊,每次只使用一塊。當這一塊內存用完,將還存活的對象復制到另外一塊,然后把已使用過的內存空間一次清理掉~
  •  1989年,Andrew Appel提出“Appel式回收”,把新生代劃分為較大的Eden和兩塊較小的Survivor空間。每次分配內存只使用Eden和其中一塊Survivor空間。發生垃圾收集時,將Eden和Survivor中仍然存活的對象一次性復制到另外一塊Survivor空間上。Eden和Survivor比例是8:1~
  • “半區復制”缺點是浪費可用空間,并且,如果對象存活率高的話,復制次數就會變多,效率也會降低。

12.標記-整理算法示意圖

  •  1974年,Edward 提出“標記-整理”算法,標記過程跟“標記-清除”算法一樣,接著讓所有存活的對象都向內存空間一端移動,然后直接清理掉邊界以外的內存~
  •  標記-清除算法和標記整理算法本質差異是:前者是一種非移動式的回收算法,后者是移動式的回收算法。
  •  是否移動存活對象都存在優缺點,移動雖然內存回收復雜,但是從程序吞吐量來看,更劃算;不移動時內存分配更復雜,但是垃圾收集的停頓時間會更短,所以看收集器取舍問題~
  •  Parallel Scavenge收集器是基于標記-整理算法的,因為關注吞吐。CMS收集器是基于標記-清除算法的,因為它關注的是延遲。

13.垃圾收集器組合圖

  •  新生代收集器:Serial、ParNew、Parallel Scavenge
  •  老年代收集器:CMS、Serial Old、Parallel Old
  •  混合收集器:G1

14.類的生命周期圖

一個類從被加載到虛擬機內存開始,到卸載出內存為止,這個生命周期經歷了七個階段:加載、驗證、準備、解析、初始化、使用、卸載。

加載階段:

  •  通過一個類的全限定名來獲取定義此類的二進制字節流。
  •  將這個字節流所代表的靜態存儲結構轉化為方法區的運行時數據結構。
  •  在內存中生成一個代表這個類的java.lang.Class對象,作為方法區這個類的各種數據的訪問入口

驗證:

  •  驗證的目的是確保Class文件的字節流中包含的信息滿足約束要求,保證這些代碼運行時不會危害虛擬機自身安全
  •  驗證階段有:文件格式校驗、元數據校驗、字節碼校驗、符號引用校驗。

準備

  •  準備階段是正式為類中定義的變量(靜態變量)分配內存并設置類變量初始值的階段。

解析

  •  解析階段是虛擬機將常量池內的符號引用替換為直接引用的過程。

初始化

  •  到了初始化階段,才真正開始執行類中定義的Java字節碼。

15.類加載器雙親委派模型圖

雙親委派模型構成

啟動類加載器,擴展類加載器,應用程序類加載器,自定義類加載器

雙親委派模型工作過程是

如果一個類加載器收到類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器完成。每個類加載器都是如此,只有當父加載器在自己的搜索范圍內找不到指定的類時(即ClassNotFoundException),子加載器才會嘗試自己去加載。

為什么需要雙親委派模型?

如果沒有雙親委派,那么用戶是不是可以自己定義一個java.lang.Object的同名類,java.lang.String的同名類,并把它放到ClassPath中,那么類之間的比較結果及類的唯一性將無法保證,因此,雙親委派模型可以防止內存中出現多份同樣的字節碼。

16.棧幀概念結構圖

棧幀是用于支持虛擬機進行方法調用和方法執行背后的數據結構。棧幀存儲了方法的局部變量表、操作數棧、動態連接和方法返回地址信息。

局部變量表

  •  是一組變量值的存儲空間,用于存放方法參數和方法內部定義的局部變量。
  •  局部變量表的容量以變量槽(Variable Slot)為最小單位。

操作數棧

  •  操作數棧,也稱操作棧,是一個后入先出棧。
  •  當一個方法剛剛開始執行的時候, 該方法的操作數棧也是空的, 在方法的執行過程中, 會有各種字節碼指令往操作數棧中寫入和提取內容, 也就是出棧與入棧操作。

動態連接

  •  每個棧幀都包含一個指向運行時常量池中該棧幀所屬方法的引用, 持有引用是為了支持方法調用過程中的動態連接(Dynamic Linking)。

方法返回地址

  •  當一個方法開始執行時, 只有兩種方式退出這個方法 。一種是執行引擎遇到任意一個方法返回的字節碼指令。另外一種退出方式是在方法執行過程中遇到了異常。

17.Java內存模型圖

  •  Java內存模型規定了所有的變量都存儲在主內存中
  •  每條線程還有自己的工作內存
  •  線程的工作內存中保存了該線程中是用到的變量的主內存副本拷貝
  •  線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存。
  •  不同的線程之間也無法直接訪問對方工作內存中的變量,線程間變量的傳遞均需要自己的工作內存和主存之間進行數據同步進行。

18.線程狀態轉換關系圖

Java語言定義了6種線程池狀態:

  •  新建(New):創建后尚未啟動的線程處于這種狀態
  •  運行(Running):線程開啟 start()方法,會進入該狀態。
  •  無限等待(Waiting):處于這種狀態的線程不會被分配處理器執行時間,一般 LockSupport::park(),沒有設置了Timeoout的 Object::wait()方法,會讓線程陷入無限等待狀態。
  •  限期等待(Timed Waiting):處于這種狀態的線程不會被分配處理器執行時間,在一定時間之后他們會由系統自動喚醒。 sleep()方法會進入該狀態~
  •  阻塞(Blocked):在程序等待進入同步區域的時候,線程將進入這種狀態~
  •  結束(Terminated):已終止線程的線程狀態,線程已經結束執行

19. Class文件格式圖

  •  u1、u2、u4、u8 分別代表1個字節、2個字節、4個字節和8個字節的無符號數
  •  表是由多個無符號數或者其他表作為數據項構成的復合數據類型
  •  每個Class文件的頭四個字節被稱為魔數(記得以前校招面試,面試官問過我什么叫魔數。。。)
  •  minor和major version表示次版本號,主版本號
  •  緊接著主次版本號之后,是常量池入口,常量池可以比喻為Class文件里的資源倉庫~

20.JVM參數思維導圖

JVM調優是通往高級開發的必經橋梁,所以好好積累JVM參數配置哈~

 

 

責任編輯:龐桂玉 來源: Java編程
相關推薦

2020-05-06 15:59:07

JavaScript程序員技術

2020-01-12 19:10:30

Java程序員數據

2009-06-25 09:33:43

Java API程序員

2020-07-20 07:46:01

程序員加簽驗簽

2020-03-16 08:22:11

Java程序員虛擬機

2020-04-20 19:00:30

程序員分布式事務架構

2019-09-25 11:39:07

程序員編程技術

2022-10-24 09:00:47

畫圖工具程序員XMind

2014-08-15 14:25:48

Android程序員資源

2014-08-20 10:28:29

Android

2011-06-11 20:59:12

程序員

2021-05-06 07:04:35

安全漏洞業務

2009-07-02 15:10:17

Java程序員面試

2015-08-20 14:34:25

程序員java基礎網絡編程

2022-03-17 10:24:28

JavaJVM

2019-07-05 10:45:27

Java程序員編程語言

2015-07-09 10:30:35

程序員必備經驗

2020-10-14 08:32:08

算法遞歸面試

2020-04-20 11:19:00

Java開發序列化

2019-07-19 10:04:05

Java程序員Tomcat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级艳情片免费观看 | 国产成人aⅴ | 日韩中文一区二区三区 | 久久三区| 九九热在线精品视频 | 91亚洲国产成人精品一区二三 | 欧美日韩国产一区二区三区不卡 | 亚洲视频在线免费 | 欧美xxxx性 | 亚洲高清在线观看 | 99久久婷婷国产综合精品电影 | 日韩a在线观看 | 日韩欧美亚洲综合 | av三级| 国产乱码精品一品二品 | 日韩欧美中文在线 | 狠狠爱免费视频 | 又爽又黄axxx片免费观看 | 久草成人网| 亚洲综合在线播放 | 国产精品a免费一区久久电影 | www.jizzjizz| 欧美日韩国产一区二区三区 | 亚洲免费在线 | 亚洲91 | 91国在线 | 性视频一区 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 亚洲精品久久久久久国产精华液 | 久久久网 | 久久99精品国产 | 日韩在线中文字幕 | 精品在线视频播放 | 国产成人精品一区二区三区视频 | 精品国产91乱码一区二区三区 | 一区二区久久 | 91综合在线视频 | 一级免费毛片 | 色综久久 | 天天曰天天干 | 九九九久久国产免费 |