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

JVM 核心知識
2022-05-11 10:58:15

1.線程

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

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

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

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

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

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

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













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

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