Spark笔记-001-GC

我真的不懂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
      • 写个只分配对象的死循环
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转折处发生Miner GC, 存活对象被放入Survivor1,可以看出上次存活对象是放入Survivor2的,这两个空间使用是交替的。

Spark内存与JVM关系

写不动了先盗个图以后补,困了。


spark-jvm.png

你可能感兴趣的:(Spark笔记-001-GC)