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)景中可以顯著提高性能。
本文摘自 :https://blog.51cto.com/l