JVM 第四阶段--垃圾回收机制(2020-02)

JVM - GC

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

	GC算法 GC-Root

在这里插入图片描述
在这里插入图片描述

eg:在heap中有A,B两个对象互相引用,但是现在没有栈桢中的引用去指向A和B,根据对象引用算法不能回收,但是根据GC Root算法A,B都没有指向栈桢中的局部变量表,所以A,B都会被回收

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标记清-楚算法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

gc-root算法可以通过A对象引用了C对象一直找可以找到至K对象,能到达的都标记一下,然后清理掉没标记过的,先标记再清楚.两次Dom

在这里插入图片描述

复制-搜集算法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标记-整理算法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

分代-收集算法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

JDK1.8前的永久代; JDK1.8后被替代为元空间

在这里插入图片描述

内存模型

在这里插入图片描述

在这里插入图片描述

GC内存回收以及四种引用的分类	

在这里插入图片描述

在这里插入图片描述

分代模型上的GC

在这里插入图片描述

垃圾回收器 --------- 交互性和吞吐率总是矛盾的

在这里插入图片描述
在这里插入图片描述

新生代收集器

STW 单线程垃圾收集器(默认新生代使用这种收集器)

在这里插入图片描述

在这里插入图片描述

ParNew是Serial版本的多线程垃圾收集器(默认新生代使用这种收集器)

在这里插入图片描述
在这里插入图片描述

Parallel Scavenge收集器

在这里插入图片描述

老年代收集器

	Serial Old收集器

在这里插入图片描述

Parallel Old收集器

在这里插入图片描述

CMS收集器

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Java内存泄漏的经典原因

1.对象定义在错误的方位

在这里插入图片描述

2.异常处理不当

在这里插入图片描述

3.集合数据管理不当

在这里插入图片描述

垃圾回收日志与算法深度解读

Minor GC

-verbose:gc 垃圾回收的详细信息
-Xms20M  Heap的初始空间大小(新生代+老年代)
-Xmx20M Heap的最大空间大小(新生代+老年代)
-Xmn10M Heap中新生代的大小
-XX:+PrintGCDetails 打印gc详细信息
-XX:SurvivorRatio=8	Eden和Survior空间的大小比例

    public static void main(String[] args) {
        int size = 1024 * 1024;
        byte[] myAlloc1 = new byte[2 * size];
        byte[] myAlloc2 = new byte[2 * size];
        byte[] myAlloc3 = new byte[3 * size];

        System.out.println("hello world");
    }

在这里插入图片描述
gc后新生代释放: 5646-624 = 5022k
gc后总的Heap空间释放: 5646-4728 = 918k
5022-918 = 4104k -〉gc后老年代减少的空间(即总堆-新生代=老年代)

结论: Minor gc后,新生代一部分被真的释放掉了,还有一部分晋升到了老年代

-------------------------------------

FULL GC

-verbose:gc 垃圾回收的详细信息
-Xms20M  Heap的初始空间大小(新生代+老年代)
-Xmx20M Heap的最大空间大小(新生代+老年代)
-Xmn10M Heap中新生代的大小
-XX:+PrintGCDetails 打印gc详细信息
-XX:SurvivorRatio=8	Eden和Survior空间的大小比例

   public static void main(String[] args) {
        int size = 1024 * 1024;
        byte[] myAlloc1 = new byte[2 * size];
        byte[] myAlloc2 = new byte[2 * size];
        byte[] myAlloc3 = new byte[2 * size];
        byte[] myAlloc4 = new byte[2 * size];

        System.out.println("hello world");
    }

在这里插入图片描述

PSYoungGen:Parallel Scavenge(新生代垃圾收集器)
ParOldGen:Parallel Old(老年代垃圾收集器)

阈值和垃圾收集器类型对于对象分配的影响实战分析

-XX:PretrnureSizeThreshold=111111 

在这里插入图片描述

在这里插入图片描述

当一个对象在新生代无法分配时 将直接放入老年代 如果老年代也无法接受 那么会报对空间不足

system.gc()会执行Full GC

MaxTenuringThreshold与阈值的动态调整详解

在这里插入图片描述

发布了19 篇原创文章 · 获赞 6 · 访问量 1975

猜你喜欢

转载自blog.csdn.net/qq_42252844/article/details/104429987
今日推荐