JVM学习笔记十三--垃圾回收相关概念

文章目录

  • 一、System.gc()的理解
  • 二、内存溢出与内存泄漏
  • 三、Stop The World
  • 四、垃圾回收的并行与并发
  • 五、安全点与安全区域
  • 六、再谈引用(强引用、软引用、弱引用、虚引用、终结器引用)


一、System.gc()的理解

JVM学习笔记十三--垃圾回收相关概念_第1张图片

二、内存溢出与内存泄漏

JVM学习笔记十三--垃圾回收相关概念_第2张图片
JVM学习笔记十三--垃圾回收相关概念_第3张图片
JVM学习笔记十三--垃圾回收相关概念_第4张图片
JVM学习笔记十三--垃圾回收相关概念_第5张图片
JVM学习笔记十三--垃圾回收相关概念_第6张图片
JVM学习笔记十三--垃圾回收相关概念_第7张图片

三、Stop The World

JVM学习笔记十三--垃圾回收相关概念_第8张图片
JVM学习笔记十三--垃圾回收相关概念_第9张图片

四、垃圾回收的并行与并发

JVM学习笔记十三--垃圾回收相关概念_第10张图片
JVM学习笔记十三--垃圾回收相关概念_第11张图片
JVM学习笔记十三--垃圾回收相关概念_第12张图片
JVM学习笔记十三--垃圾回收相关概念_第13张图片
JVM学习笔记十三--垃圾回收相关概念_第14张图片

五、安全点与安全区域

JVM学习笔记十三--垃圾回收相关概念_第15张图片
JVM学习笔记十三--垃圾回收相关概念_第16张图片
JVM学习笔记十三--垃圾回收相关概念_第17张图片
JVM学习笔记十三--垃圾回收相关概念_第18张图片

六、再谈引用(强引用、软引用、弱引用、虚引用、终结器引用)

JVM学习笔记十三--垃圾回收相关概念_第19张图片
JVM学习笔记十三--垃圾回收相关概念_第20张图片
JVM学习笔记十三--垃圾回收相关概念_第21张图片
JVM学习笔记十三--垃圾回收相关概念_第22张图片
JVM学习笔记十三--垃圾回收相关概念_第23张图片
JVM学习笔记十三--垃圾回收相关概念_第24张图片
测试代码:

public class StrongReferenceTest {

    public static void main(String[] args) {

        StringBuffer str = new StringBuffer("hello,尚硅谷");

//        StringBuffer str1 = str;
        str = null;
        System.gc();

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(str);

    }

}

JVM学习笔记十三--垃圾回收相关概念_第25张图片
JVM学习笔记十三--垃圾回收相关概念_第26张图片
测试代码:

public class SoftReferenceTest {

    public static class User{
        private int id;
        private String name;

        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        //创建对象,建立软引用
        SoftReference<User> softReference = new SoftReference<>(new User(1, "xzt"));

        //从软引用中重新获得强引用对象
        System.out.println(softReference.get());

        System.gc();
        System.out.println("After GC:");

        //垃圾回收后获得软引用中的对象
        System.out.println(softReference.get());

        try {
            //让系统认为内存资源很紧张、
            byte[] b = new byte[1024 * 1024 * 7];
        }catch (Throwable e){
            e.printStackTrace();
        }finally {
            System.out.println(softReference.get());
        }

    }

}

JVM学习笔记十三--垃圾回收相关概念_第27张图片
JVM学习笔记十三--垃圾回收相关概念_第28张图片
测试代码:

public class WeakReferenceTest {

    public static class User{
        private int id;
        private String name;

        public User(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) {
        WeakReference<User> weakReference = new WeakReference<>(new User(1, "xzt"));

        System.out.println(weakReference.get());

        System.gc();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(weakReference.get());

    }

}

JVM学习笔记十三--垃圾回收相关概念_第29张图片
JVM学习笔记十三--垃圾回收相关概念_第30张图片
测试代码:

public class PhantomReferenceTest {
    public static PhantomReferenceTest obj;//当前类对象的声明
    static ReferenceQueue<PhantomReferenceTest> phantomQueue = null;//引用队列

    public static class CheckRefQueue{
        public void check(){
            while (true) {
                if(phantomQueue != null){
                    PhantomReference<PhantomReferenceTest> objt = null;

                    try {
                        objt = (PhantomReference<PhantomReferenceTest>) phantomQueue.remove();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    if(objt != null){
                        System.out.println(objt);
                        System.out.println("追踪垃圾回收过程:PhantomReferenceTest实例被GC了");
                    }
                }
            }
        }
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("调用当前类的finalize方法");
        obj = this;
    }

    public static void main(String[] args) {
        CheckRefQueue checkRefQueue = new CheckRefQueue();
        new Thread(() -> {
            checkRefQueue.check();
        },"A").start();

        phantomQueue = new ReferenceQueue<>();
        obj = new PhantomReferenceTest();

        //构造PhantomReferenceTest 对象的虚引用,并指定了引用队列
        PhantomReference<PhantomReferenceTest> phantomReference = new PhantomReference<>(obj, phantomQueue);

        try {
            System.out.println(phantomReference.get());

            obj = null;

            System.gc();

            Thread.sleep(1000);

            if(obj == null){
                System.out.println("obj == null");
            }else{
                System.out.println("obj可用");
            }

            System.out.println("第2次gc");
            obj = null;

            System.gc();

            Thread.sleep(1000);

            if(obj == null){
                System.out.println("obj == null");
            }else{
                System.out.println("obj可用");
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

JVM学习笔记十三--垃圾回收相关概念_第31张图片

你可能感兴趣的:(JVM,java,jvm,内存泄漏,内存管理,面试)