線程共享:全部線程能訪問這塊內存數據,隨虛擬機或GC而建立和銷燬算法
線程獨佔:每一個線程都會有它獨立的空間,隨線程生命週期而建立和銷燬數組
線程安全問題:共享資源的搶佔、線程共享的內存區域安全
方法區做用:存儲加載的類信息、常量、靜態變量、JIT編譯後的代碼等數據佈局
GC:方法區存在垃圾回收,但回收效率低;回收主要針對常量池的回收。和類型的卸載;當方法區沒法知足內存需求時,報OOM。spa
方法區屬於Java虛擬機協議,好比Hotsport虛擬機是對其具體實現,實現的時候會去實現方法區,堆內存,垃圾回收GC,永久代是對方法區的實現,新生代,老年代對堆內存實現,jdk1.8就變了,以元數據來實現方法區。線程
做用:惟一的目的就是存放對象實例,幾乎全部對象、數組都是在這裏存放3d
對於大多數應用來講,堆是JVM管理的內存中最大的一塊內存區域,也是最容易OOM的區域對象
大多數JVM都將堆實現爲大小可擴展的(經過-Xmx、-Xms)控制blog
一、引用計數法(沒法解決兩個對象相互引用沒法回收問題,致使內存泄露,JVM確定不回去使用這種方式)生命週期
二、可達性分析算法
主流的商用程序語言(Java、C#)都是經過可達性分析算法來斷定對象是否存活的,
GC Roots能夠是:一、虛擬機棧;二、方法中靜態屬性引用對象;三、方法區中常量引用對象;四、Native方法引用對象。
虛擬機棧:線程中方法執行的模型,每一個方法執行時,就會在虛擬機棧中建立一個棧幀,每一個方法從調用到執行的過程,就對應棧幀在虛擬機棧中從入棧到出棧過程。
Java線程本質是:從邏輯上來理解,開啓一個Java線程,new Thread(()->{線程執行的業務代碼})
main->show()->show1()->shou2()這樣的調用鏈路,先進後出,就是棧,也就是表明虛擬機棧方法調用邏輯
虛擬機棧中的元素在邏輯上表明方法,表明方法的棧元素就叫作棧幀。
方法裏的局部變量並非一致存在,只有在方法調用的時候纔會存在,只有在方法調用纔會有方法入棧。
本地方法棧:和虛擬機棧功能相似,虛擬機棧是爲虛擬機執行Java方法而準備,本地方法棧是爲虛擬機使用Native本地方法而準備的。
直接內存:JVM以外的內存,開發人員本身分配內存
如今看下整個過程執行流程
切換上下文方式,程序計數器來跟蹤。