我真的不懂Java...
GC急速入門
Java對象在內(nèi)存中的結(jié)構(gòu)
-
如何確定對象可以被回收
- java通過引用訪問堆中對象
- 通過根節(jié)點可達性分析確定可以被回收。本地變量表引用的對象,方法區(qū)靜態(tài)屬性引用的對象惠昔,常量引用的對象,本地方法棧中JNI引用的對象速兔,可以作為根節(jié)點。
-
如何進行垃圾回收
- 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(){![spark-jvm.png](https://upload-images.jianshu.io/upload_images/12606989-84091793beb64f11.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
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)系
寫不動了先盜個圖以后補诉稍,困了。
spark-jvm.png