運行時數據區有五個部分:本地方法棧、虛擬機棧、程序計數器、堆和方法區。
Java虛擬機定義了若干程序運行期間會使用到的運行時數據區,其中有一些會隨著虛擬機(對應一個進程)的啟動而創建,隨著虛擬機的退出而銷毀。另外一些則是與線程一一對應的,這些與線程對應的數據區會隨著線程開始和結束而創建和銷毀。
?每個線程各自擁有:程序計數器、虛擬機棧、本地方法棧
?線程間共享:堆、方法區(堆外內存)【永久代或元空間、代碼緩存】
堆空間和方法區是共用的,所以涉及線程安全問題。JVM優化重點優化堆空間也包括方法區。
一個JVM實例對應一個Runtim實例,相當于一個運行時數據區。(每個JVM只有一個Runtime實例)
線程是一個程序里的運行單元。JVM允許一個應用有多個線程并行執行。
在Hotspot VM里,每個線程都與操作系統的本地線程直接映射。當一個Java線程準備好執行以后(程序計數器、棧結構、緩存分配、本地存儲的準備工作),此時一個操作系統的本地線程也同時創建。Java線程執行終止后,本地線程也會回收。
操作系統負責所有線程的安排調度到任何一個可用的CPU上。一旦本地線程初始化成,它就會調用Java線程中的run()
方法,如果執行run()
方法過程中出現了未捕獲的異常,會導致Java線程終止,本地線程來決定JVM到底要不要終止(判斷當前線程是不是最后一個非守護線程,如果是則退出JVM)。