我真的不懂Java...
GC急速入门
Java对象在内存中的结构
-
如何确定对象可以被回收
- java通过引用访问堆中对象
- 通过根节点可达性分析确定可以被回收。本地变量表引用的对象,方法区静态属性引用的对象,常量引用的对象,本地方法栈中JNI引用的对象,可以作为根节点。
-
如何进行垃圾回收
- Mark-Sweep
- Copying
- Mark-Compact
- 分代
-
分代
分为新生代,老年代,永久代。
新对象分在Eden和Survivor1,如果空间不足,发生MinorGC,将Eden,Survivor1中存活的对象移动到Survivor2中,将Eden,Survivor1中对象清理掉。如果Survivor2中也不够,那么放到老年代。接下来对象分配到Eden和Survivor2中,也就是说Survivor1和2角色互换了。- 装个Visual GC看一眼,安装指南指路https://www.cnblogs.com/linghu-java/p/5689227.html
- 写个只分配对象的死循环
- 装个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();
}
}
}
-
看一眼
这里面Eden Space转折处发生Miner GC, 存活对象被放入Survivor1,可以看出上次存活对象是放入Survivor2的,这两个空间使用是交替的。
Spark内存与JVM关系
写不动了先盗个图以后补,困了。