一.運行時數據區java
1.線程共享和線程私有:程序員
01.線程共享:算法
堆,方法區數組
02.線程私有:數據結構
虛擬機棧,本地方法棧,程序計數器jvm
2.程序計數器函數
當前線程執行字節碼文件的行號指示器spa
可以在線程切換以後,找到本身正確的位置線程
是惟一一個不會致使內存泄漏(OutOfMemory,OOM)的區域翻譯
3.虛擬機棧:
基本數據類型的變量和對象的引用變量都存在此區域;
遵循「先進後出,後進先出」
StackOverFlowError:
線程請求的棧深度大於了虛擬機規定的最大深度
OutOfMemoryError:
虛擬機在擴展棧時,沒法申請到足夠的內存空間!
4.本地方法棧
主要服務於Native修飾的方法
在HotSport中虛擬機棧和本地方法棧合爲一體
堆:
全部對象的實例和數組開闢空間都在此區域保存!
全部線程共享
GC主要回收對象的區域
1.堆分區:新生代,老年代,永久代
2.方法區(靜態去)
全部線程共享;
方法(包含構造函數),接口 定義在此區域;
全部方法的信息
靜態變量+常量+類信息+方法信息+常量池
二.類的生命週期:
類的生命週期從類被加載,鏈接和初始化開始到類的卸載結束
01.類的生命週期中,類的二進制位於方法區;
02.在堆中會有一個描述這個類的Class對象;
2.1加載將class字節碼文件內容加載到內存中,並將這些靜態數據轉換成方法區中運行時數據結構,在堆中生成一格Class對象;這個Class對象就是方法區類數據的訪問入口
2.2連接
0.1類的驗證
001.類文件的結構檢查
002.語義檢查 好比說final修飾的變量在編譯期間發現再次賦值
003.字節碼驗證,確保字節碼能被jvm識別
0.2類的準備
爲類中全部static修飾的內容開闢空間,並賦予初始值!!
static int num=100;
這時候 num=0;
0.3類的解析
符號引用:就是用字符串的形式來表示某個變量或是類,咱們能看懂String a="a"; Student stu=new Student();
直接引用:是根據符號引用翻譯出來的地址!
2.3 初始化
加載不是初始化
初始化指的是實例化!建立出類的實例!
初始化的時機
01.類的主動引用
001.new一個類的對象
002.經過反射的newInstance();
003.再初始化子類時候必須先初始化父類
02.類的被動引用
001.經過類名訪問靜態內容
002.調用類的靜態常量也會不會初始化類
003.用類做爲對象數組存在時,也不會初始化類
004.子類調用父類的靜態變量不會加載子類的靜態代碼塊(不會執行類的準備階段)
JVM垃圾回首機制
一.垃圾回收機制(GC)
1.1:爲啥須要垃圾回收機制
01.只要是對象被建立,那麼就會在虛擬機的堆中開闢空間;
02.程序運行過程當中會建立N個對象,美哥對象都會有本身的空間;
03.若是每一個對象都永久的佔領這塊空間,顯然內存是不夠的
總結:爲了保證其餘對象可以被正確的建立!!
在C語言中,垃圾回收的任務是程序員自身負責的
可能會出現的問題:
01.因爲程序猿粗枝大葉,致使煤油及時釋放不使用的對象,釋放錯誤!
02.程序猿一旦釋放了程序核心對象(好比說系統對象),系統崩潰!
1.2:垃圾回收機制的定義
在java程序運行過程當中,jvm有一個專門負責回收那些再也不使用的對象
所佔的內存,這種回收的過程,咱們稱之爲垃圾回收機制(GC,Garbage Collection)
1.3:垃圾回收機制的特色
01.減輕了程序猿進行內存管理的負擔
02.防止系統內存被非法釋放,使咱們的程序更加健壯
03.只有在對象不被任何變量引用時,才能被回收
04.程序沒法讓垃圾回收機制強行回收垃圾操做
05.當垃圾回收機制將要回收不用的對象內存時,會先調用這個對象的finalize()
這個方法可能使對象復活,致使垃圾回收器取消對該對象的回收。:
1.4:對象的狀態
在虛擬機的垃圾回收器來看,堆中全部的對象都有三種狀態!
01.可觸及狀態
02.可復活狀態
03.不可觸及狀態
直郵對向出於不可觸及狀態的時候,垃圾回收機制真正的釋放對象所佔有的內存