第六章 垃圾回收(❤❤❤)

在这里插入图片描述

一. 垃圾回收概述

在这里插入图片描述

二. 根搜索算法

在这里插入图片描述

在这里插入图片描述

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

三. 引用分类(❤❤❤)

在这里插入图片描述

在这里插入图片描述

1. 软引用:SoftReference演示

package src.com.yh.jvm.gc;

import java.lang.ref.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收-引用分类
 * 对象使用
 * 1. 软引用:SoftReference
 * 2. 弱引用:WeakReference
 * 3. 虚引用:PhantomReference
 */
public class ReferenceType {
    /**
     * 一种队列,用于存放User
     */
    private static ReferenceQueue<User> rq = new ReferenceQueue<User>();

    /**
     * 验证rq队列是否释放
     */
    private static void printQueue(String str) {
        //获取rq队列内容
        Reference<? extends User> poll = rq.poll();
        if (poll != null) {
            System.out.println("the gc Object Reference==" + str + " = " + poll.get());
        }
    }

    /**
     * 软引用使用User对象
     * 还有用,但非必须对象
     * 内存足时不会被回收,不足时会被回收
     */
    private static void testSoftReference() throws InterruptedException {
        List<SoftReference<User>> list
                = new ArrayList<SoftReference<User>>();
        //userSoftReference填充
        for (int i = 0; i < 10; i++) {
            //基于软引用创建对象,放入rq队列中
            SoftReference<User> sr
                    = new SoftReference<User>(new User("soft-" + i), rq);
            System.out.println("now the soft user==" + sr.get());
            list.add(sr);
        }
        //触发垃圾回收
        System.gc();
        //休息一下
        Thread.sleep(1000L);
        printQueue("soft");
    }


    public static void main(String[] args) {
        try {
            //演示软引用GC回收
            testSoftReference();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


}

package src.com.yh.jvm.gc;

/**
 * 用于演示垃圾回收
 */
public class User {
    //演示被回收,设置对象大小
    private byte[] bs = new byte[1024*5];//5K

    private String userId;

    public User(String userId) {
        this.userId = userId;
    }

    @Override
    public String toString() {
        return "userId=='" + userId;
    }

    /**
     * 在对象即将被回收时调用
     *
     * @throws Throwable
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("now finalize userId==" + userId);
    }
}

内存充足时
在这里插入图片描述

限制Xms
在这里插入图片描述

2. 弱引用:WeakReference

package src.com.yh.jvm.gc;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收-引用分类
 * 对象使用
 * 2. 弱引用:WeakReference
 */
public class WeakReferenceType {
    /**
     * 一种队列,用于存放User
     */
    private static ReferenceQueue<User> rq = new ReferenceQueue<User>();

    /**
     * 验证rq队列是否释放
     */
    private static void printQueue(String str) {
        //获取rq队列内容
        Reference<? extends User> poll = rq.poll();
        if (poll != null) {
            System.out.println("the gc Object Reference==" + str + " = " + poll.get());
        }
    }

    /**
     * 软引用使用User对象
     * 还有用,但非必须对象
     * 内存足时不会被回收,不足时会被回收
     */
    private static void testWeakReference() throws InterruptedException {
        List<WeakReference<User>> list
                = new ArrayList<WeakReference<User>>();
        //userWeakReference填充
        for (int i = 0; i < 10; i++) {
            //基于软引用创建对象,放入rq队列中
            WeakReference<User> sr
                    = new WeakReference<User>(new User("weak-" + i), rq);
            System.out.println("now the weak user==" + sr.get());
            list.add(sr);
        }
        Thread.sleep(1000L);
        //触发垃圾回收
        System.gc();
        //休息一下
        Thread.sleep(1000L);
        printQueue("weak");
    }


    public static void main(String[] args) {
        try {
            //演示弱引用GC回收
            testWeakReference();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


}

在这里插入图片描述
弱引用:WeakReference,只要触发了垃圾回收就会被回收掉

3. 虚引用:PhantomReference

package src.com.yh.jvm.gc;

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.PhantomReference;
import java.util.ArrayList;
import java.util.List;

/**
 * 垃圾回收-引用分类
 * 对象使用
 * 3. 虚引用:PhantomReference
 */
public class PhantomReferenceType {
    /**
     * 一种队列,用于存放User
     */
    private static ReferenceQueue<User> rq = new ReferenceQueue<User>();

    /**
     * 验证rq队列是否释放
     */
    private static void printQueue(String str) {
        //获取rq队列内容
        Reference<? extends User> poll = rq.poll();
        if (poll != null) {
            System.out.println("the gc Object Reference==" + str + " = " + poll.get());
        }
    }

    /**
     * 软引用使用User对象
     * 还有用,但非必须对象
     * 内存足时不会被回收,不足时会被回收
     */
    private static void testPhantomReference() throws InterruptedException {
        List<PhantomReference<User>> list
                = new ArrayList<PhantomReference<User>>();
        //userPhantomReference填充
        for (int i = 0; i < 10; i++) {
            //基于软引用创建对象,放入rq队列中
            PhantomReference<User> sr
                    = new PhantomReference<User>(new User("phantom-" + i), rq);
            System.out.println("now the phantom user==" + sr.get());
            list.add(sr);
        }
        Thread.sleep(1000L);
        //触发垃圾回收
        System.gc();
        //休息一下
        Thread.sleep(1000L);
        printQueue("phantom");
    }


    public static void main(String[] args) {
        try {
            //演示虚引用:PhantomReferenceGC回收
            testPhantomReference();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }


}

四. 垃圾回收基础

1. 跨代引用

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

2. 垃圾判断步骤

在这里插入图片描述

package src.com.yh.jvm.gc;

import java.lang.ref.Cleaner;
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;

public class HelpSelf {
    private static HelpSelf hs=null;

    private static Integer i=0;

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        ++i;
        System.out.println("调用finalize()..."+i );
        //自救
        hs=this;
    }

    public static void main(String[] args) throws Exception{
        hs=new HelpSelf();

        //第一次
        hs=null;

        System.gc();
        Thread.sleep(1000l);

        System.out.println("第一次回收后 hs=="+hs);

        //第一次
        hs=null;

        System.gc();
        Thread.sleep(1000l);

        System.out.println("第二次回收后 hs=="+hs);
    }
}

运行结果
在这里插入图片描述

GC第二次回收没有再调用finalize方法了,finalize方法只调用一次

3. GC类型

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

4. 垃圾收集类型

在这里插入图片描述

5. 无用类判断

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

五. 垃圾回收算法

1. 标记清除法

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

2. 复制算法

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

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

在这里插入图片描述

在这里插入图片描述

3. 标记整理法

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

六. 垃圾收集器

在这里插入图片描述

在这里插入图片描述

1. HotSpot

在这里插入图片描述

2. 串行收集器

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

3. 并行收集器

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

4. 新生代PS收集器

在这里插入图片描述

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

5. CMS收集器

在这里插入图片描述

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

七. G1收集器

1. 特点

在这里插入图片描述

存储接口示意图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 运行阶段

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

3. 回收过程

新生代回收过程

在这里插入图片描述

在这里插入图片描述

老年代回收过程

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

筛选回收
在这里插入图片描述
在这里插入图片描述

4. 使用配置(❤❤❤)

在这里插入图片描述
官方文档

-XX:InitiatingHeapOccupancyPercent=percent
	Sets the percentage of the old generation occupancy (0 to 100) at which to start the first few concurrent marking cycles for the G1 garbage collector.
	By default, the initiating value is set to 45%. A value of 0 implies nonstop concurrent GC cycles from the beginning until G1 adaptively sets this value.
	See also the -XX:G1UseAdaptiveIHOP and -XX:G1AdaptiveIHOPNumInitialSamples options.
	The following example shows how to set the initiating heap occupancy to 75%:
		-XX:InitiatingHeapOccupancyPercent=75


	设置G1垃圾回收器开始前几个并发标记周期的旧一代占用率百分比(0到100)。
	默认情况下,初始值设置为45%。
	值为0意味着从开始到G1自适应地设置该值为止,不间断的并发GC循环。
	另请参阅-XX:G1使用自适应IHOP和-XX:G1AdaptiveIHOPNumInitialSamples选项。
	以下示例显示了如何将初始堆占用率设置为75%:
		-XX:InitiatingHeapOccupancyPercent=75

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

八. ZGC收集器

1. 概述

在这里插入图片描述

2. GC性能指标

在这里插入图片描述
运行总时间=应用代码执行时间+GC运行时间+暂停时间

在这里插入图片描述

3. JVM内存配置原则(❤❤❤)

3.1 新生代

在这里插入图片描述

3.2 老年代

在这里插入图片描述

3.3 吞吐量

在这里插入图片描述

3.4 存活周期

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与海boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值