ClassLoader(類加載器)
什麼是類加載器?
加載和初始化.class文件
類加載器有幾種?
3種分別是:啓動類加載器(BootStrap)
擴展類加載器(Extension)
應用程序加載器(AppClassLoader)
什麼是雙親委派?
AppClassLoader要加載class文件不會立即加載,他會把類加載請求委派給父類加載器ExtClassLoader去完成。
ExtClassLoader要加載class文件也不會立即加載,他會把類加載請求委派給父類加載器BootStrapClassLoader去完成。
如果BootStrapClassLoader加載失敗(例如在$JAVA_HOME/jre/lib裏未查找到該class),他會使用ExtClassLoader進行嘗試加載。
如果ExtClassLoader也加載失敗,會使用AppClassLoader進行加載,如果AppClassLoader也加載失敗,將會跑出異常ClassNotFoundException。
什麼是沙箱安全?
防止隨意代碼污染java主代碼
Native
放在native方法棧中(不歸java管理,用於調用其他語言服務)
PC寄存器
存儲下一條指令的地址,也是當前線程執行的字節碼的行號指示器。
方法區
1.所有線程共享
2.會有垃圾回收
什麼是方法區?
a.各線程共享的運行時內存區域,存儲了類的結構信息。
b.方法區就是一個規範、模板。
例如:
方法區 f = new 元空間()
方法區 f = new 永久代()
相當於:List list=new ArrayList()
等號左邊是引用(reference),等號右邊是實例對象
*注* 靜態方法屬於全員方法獨一份,實例變量是自帶的變量
實例變量存在堆中,和方法區無關
*************棧管運行,堆管存儲************
*java棧(stack)
棧內存不存在垃圾回收
生命週期和線程一致
stack存在哪些東西?
8種基本數據類型的變量+對象的引用+實例方法都是在函數棧內存中分配。
*注*經典數據結構:
隊列:(FIFO)先進先出
棧:先進後出
*注* 8種數據類型:
1.整數型byte(8位),short(16位),int(32位),long(64位)
2.浮點型:double(64位),float(32位)
3.布爾型:Boolean(1位)
4.字符型:char(16位)
java方法 = 棧幀
*注*引用類型(reference)全部在棧裏面
Person p1=new Person()
1.Person p1就是reference在棧中
2.new Person()是實例在堆中
3.Person類中結構信息在方法區中
棧溢出:StackOverflowError
*heap堆
堆的邏輯結構
============================================
新生代new
伊甸園(Eden Space)
倖存者0區(Survivor 0 Space)
倖存者1區(Survivor 1 Space)
老年代old
元空間
============================================
例子:
new Person();
new在了新生代的Eden Space
進一步流入到Survivor 0 Space
然後流入 Survivor 1 Space
最後流入 old
Eden Space full à YGC(輕GC)
Old Space full à FGC
Full GC多次之後發現養老區沒有空間能騰出,報錯OOM
from和to:GC之後有交換誰空誰是to
*注* 引用類型傳內存地址
基本數據類型傳複印件
Young 1/3 Old 2/3
=================================================================
|Eden (8/10)|Survivor From(1/10)|Survivor To(1/10)| |
=================================================================
複製->清空->交換
第一次GC,Eden區倖存的對象複製到Survivor From中,接着對Eden區進行清空,存活的對象年齡加一。第二次GC,掃描Eden區和Survivor From區,如果有幸存的對象直接放入Survivor to區,然後to區和from區進行互換,並且倖存的對象年齡加一。15次GC之後還存活的對象直接放入Old區。
元空間(Perm)邏輯上屬於heap,但是實際上他是方法區的一個實現,元空間存儲的是jdk自身攜帶的Class,Interface的元數據。
棧+堆+方法區的交互關係
方法區中是模板,heap中是實例對象,棧中是對象的引用。