1.線程
這里所說的線程指程序執(zhí)行過程中的一個線程實體。JVM 允許一個應用并發(fā)執(zhí)行多個線程。Hotspot JVM 中的 Java 線程與原生操作系統(tǒng)線程有直接的映射關系。當線程本地存儲、緩沖區(qū)分配、同步對象、棧、程序計數(shù)器等準備好以后,就會創(chuàng)建一個操作系統(tǒng)原生線程。Java 線程結束,原生線程隨之被回收。操作系統(tǒng)負責調度所有線程,并把它們分配到任何可用的 CPU 上。當原生線程初始化完畢,就會調用 Java 線程的 run() 方法。當線程結束時,會釋放原生線程和 Java 線程的所有資源。
2.JVM 內存區(qū)域
- 線程私有
- 程序計數(shù)器:指向虛擬機字節(jié)碼指令的位置,唯一一個無OOM的區(qū)域
- 虛擬機棧
- 虛擬機棧與線程的生命周期相同
- 一個線程中,每調用一個方法創(chuàng)建一個棧幀(Stack Frame)
- 棧幀結構:本地變量 操作數(shù)棧 對運行時常量池的引用
- 異常:
- 線程請求的棧深度大于JVM所允許的深度,會出現(xiàn):StackOverflowEiior
- 若JVM允許動態(tài)擴展,若無法申請到足夠內存,則出現(xiàn):OutOfMemoryError
- 本地方法棧
- 線程共享
- Java 堆:類的實例
- 新生代
- eden
- from survivor
- to survivor
- 老年代
- 異常 :OutOfMemoryError?
- 方法區(qū)
- 直接內存:不受JVM GC 管理
線程私有數(shù)據(jù)區(qū)域生命周期與線程相同, 依賴用戶線程的啟動/結束 而 創(chuàng)建/銷毀(在 Hotspot ?VM 內, 每個線程都與操作系統(tǒng)的本地線程直接映射, 因此這部分內存區(qū)域的存/否跟隨本地線程的生/死對應)。
線程共享區(qū)域隨虛擬機的啟動/關閉而創(chuàng)建/銷毀。
直接內存并不是 JVM 運行時數(shù)據(jù)區(qū)的一部分, 但也會被頻繁的使用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 與 Buffer 的 IO 方式, 它可以使用 Native 函數(shù)庫直接分配堆外內存, 然后使用DirectByteBuffer 對象作為這塊內存的引用進行操作(詳見: Java I/O 擴展), 這樣就避免了在 Java堆和 Native 堆中來回復制數(shù)據(jù), 因此在一些場景中可以顯著提高性能。
本文摘自 :https://blog.51cto.com/l