我真的不懂Java...
GC急速入門
Java對象在內(nèi)存中的結(jié)構(gòu)
-
如何確定對象可以被回收
- java通過引用訪問堆中對象
- 通過根節(jié)點(diǎn)可達(dá)性分析確定可以被回收。本地變量表引用的對象,方法區(qū)靜態(tài)屬性引用的對象,常量引用的對象,本地方法棧中JNI引用的對象,可以作為根節(jié)點(diǎn)。
-
如何進(jìn)行垃圾回收
- Mark-Sweep
- Copying
- Mark-Compact
- 分代
-
分代
分為新生代,老年代,永久代。
新對象分在Eden和Survivor1,如果空間不足,發(fā)生MinorGC,將Eden,Survivor1中存活的對象移動到Survivor2中,將Eden,Survivor1中對象清理掉。如果Survivor2中也不夠,那么放到老年代。接下來對象分配到Eden和Survivor2中,也就是說Survivor1和2角色互換了。- 裝個Visual GC看一眼,安裝指南指路https://www.cnblogs.com/linghu-java/p/5689227.html
- 寫個只分配對象的死循環(huán)
- 裝個Visual GC看一眼,安裝指南指路https://www.cnblogs.com/linghu-java/p/5689227.html
public class GCTest {
public static void test(){
String s = new String("abc");
}
public static void main(String[] args){
while(true){
test();
}
}
}
-
看一眼
YoungGen.png
這里面Eden Space轉(zhuǎn)折處發(fā)生Miner GC, 存活對象被放入Survivor1,可以看出上次存活對象是放入Survivor2的,這兩個空間使用是交替的。
Spark內(nèi)存與JVM關(guān)系
寫不動了先盜個圖以后補(bǔ),困了。

spark-jvm.png
