當(dāng)前位置:首頁(yè) > IT技術(shù) > 其他 > 正文

JVM 核心知識(shí)
2022-05-11 10:58:15

1.線程

這里所說(shuō)的線程指程序執(zhí)行過(guò)程中的一個(gè)線程實(shí)體。JVM 允許一個(gè)應(yīng)用并發(fā)執(zhí)行多個(gè)線程。Hotspot JVM 中的 Java 線程與原生操作系統(tǒng)線程有直接的映射關(guān)系。當(dāng)線程本地存儲(chǔ)、緩沖區(qū)分配、同步對(duì)象、棧、程序計(jì)數(shù)器等準(zhǔn)備好以后,就會(huì)創(chuàng)建一個(gè)操作系統(tǒng)原生線程。Java 線程結(jié)束,原生線程隨之被回收。操作系統(tǒng)負(fù)責(zé)調(diào)度所有線程,并把它們分配到任何可用的 CPU 上。當(dāng)原生線程初始化完畢,就會(huì)調(diào)用 Java 線程的 run() 方法。當(dāng)線程結(jié)束時(shí),會(huì)釋放原生線程和 Java 線程的所有資源。

2.JVM 內(nèi)存區(qū)域

  • 線程私有
  • 程序計(jì)數(shù)器:指向虛擬機(jī)字節(jié)碼指令的位置,唯一一個(gè)無(wú)OOM的區(qū)域
  • 虛擬機(jī)棧
  • 虛擬機(jī)棧與線程的生命周期相同
  • 一個(gè)線程中,每調(diào)用一個(gè)方法創(chuàng)建一個(gè)棧幀(Stack Frame)
  • 棧幀結(jié)構(gòu):本地變量 操作數(shù)棧 對(duì)運(yùn)行時(shí)常量池的引用
  • 異常:
  • 線程請(qǐng)求的棧深度大于JVM所允許的深度,會(huì)出現(xiàn):StackOverflowEiior
  • 若JVM允許動(dòng)態(tài)擴(kuò)展,若無(wú)法申請(qǐng)到足夠內(nèi)存,則出現(xiàn):OutOfMemoryError
  • 本地方法棧
  • 線程共享
  • Java 堆:類的實(shí)例
  • 新生代
  • eden
  • from survivor
  • to survivor
  • 老年代
  • 異常 :OutOfMemoryError?
  • 方法區(qū)
  • 直接內(nèi)存:不受JVM GC 管理

線程私有數(shù)據(jù)區(qū)域生命周期與線程相同, 依賴用戶線程的啟動(dòng)/結(jié)束 而 創(chuàng)建/銷毀(在 Hotspot ?VM 內(nèi), 每個(gè)線程都與操作系統(tǒng)的本地線程直接映射, 因此這部分內(nèi)存區(qū)域的存/否跟隨本地線程的生/死對(duì)應(yīng))。

線程共享區(qū)域隨虛擬機(jī)的啟動(dòng)/關(guān)閉而創(chuàng)建/銷毀。

直接內(nèi)存并不是 JVM 運(yùn)行時(shí)數(shù)據(jù)區(qū)的一部分, 但也會(huì)被頻繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 與 Buffer 的 IO 方式, 它可以使用 Native 函數(shù)庫(kù)直接分配堆外內(nèi)存, 然后使用DirectByteBuffer 對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作(詳見(jiàn): Java I/O 擴(kuò)展), 這樣就避免了在 Java堆和 Native 堆中來(lái)回復(fù)制數(shù)據(jù), 因此在一些場(chǎng)景中可以顯著提高性能。

JVM 核心知識(shí)_數(shù)據(jù)













本文摘自 :https://blog.51cto.com/l

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >