【JVM16】垃圾回收的相关概念的概述

1、System.gc()的理解

  1. 在默认情况下,通过System. gc ()(实际调用的是Runtime.getRuntime().gc())的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。
  2. 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。
  3. JVM实现者可以通过System. gc ()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。
public class Test1 {

    public static void main(String[] args) {
        new Test1();
        System.gc();//提醒垃圾回收器进行gc,但是不一定会gc;实际调用了Runtime.getRuntime().gc()方法
        //System.runFinalization();//强制使用 没有引用的对象(垃圾对象) 的finalize()方法;
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("调用了重写的的finalize()方法");
    }
}

举例:

public class Test02 {

    public static void main(String[] args) {
        {
            byte[] buffer = new byte[10 * 1024 * 1024];
        }
          System.gc();
    }
}

System.gc()没有回收掉buffer。
在这里插入图片描述
在这里插入图片描述
可以看到局部变量表的长度为2,但是局部变量只有args参数,其实还隐藏这一个buffer。这个方法里没有其他变量把buffer的slot占据,所以回收不了buffer。

2、内存溢出(OOM)与内存泄漏(Memory Leak)

(1)内存溢出(OOM)
  1. 内存溢出:
    GC会进行在各个年龄段,当要快发生OOM时,会进行一次独占式的llGC(放大招),这时会放大量的内存,如果空间还不够,就会报OOM;
  2. 原因
    (1)Java虚拟机堆内存设置不够
    (2)代码块中创建大量的大对象,并且长时间不能够被回收。
    (3)由内存泄露引起
(2)内存泄漏

原因:对象不会被程序用到了(但是这个对象可能还是被引用到),但是垃圾收集器无法回收这种对象。
举例:
在这里插入图片描述

3、Stop The World

在这里插入图片描述

4、垃圾回收的并行与并发(为下一章做铺垫)

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

在这里插入图片描述

5、安全点与安全区域

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

6、引用(偏门高频面试题)

1、再谈引用
  1. 我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。
  2. [既偏门又非常高频的面试题]强引用、软引用、弱引用、虚引用有什么区别?具体使用场景是什么?
  3. 在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(StrongReference)、软引用(Soft Reference) 、弱引用(Weak Reference) 和虛引用(Phantom Reference) 4种,这4种引用强度依次逐渐减弱。除强引用外,其他3种引用均可以在java. lang. ref包中找到它们的身影。如下图,显示了这3种引用类型对应的类,开发人员可以在应用程序中直接使用它们。

在这里插入图片描述

  1. Reference子类中只有终结器引用是包内可见的,其他3种引用类型均为public,可以在应用程序中直接使用
  2. 强引用(StrongReference) :最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new object()"这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
    软引用(SoftReference) :在系统将要发生内存溢出之前,将会把这些对象列入回收。范围之中进行第二次回收(回收软引用)。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。
    弱引用(WeakReference) :被弱引用关联的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存空间是否足够,都会回收掉被弱引用关联的对象。
    虛引用(PhantomReference) :一个对象是否有虛引用的存在,完全不会对其生存时间构成影响,也无法通过虛引用来获得一个对象的实例。为一个对象设置虛引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
2、强引用

如:
Object obj=new Object;

3、软引用
  1. 描述:当内存足够,是不会回收软引用的可达对象,当内存不够时(不一定是要发生OOM),则回收软引用可以到达的对象;

  2. 软引用是用来描述一些还有用,但非必需的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。

  3. 作用在:软引用通常用来实现内存敏感的缓存。比如:高速缓存就有用到软引用,Mybatis源码就用到软引用来做缓存。如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证。了使用缓存的同时,不会耗尽内存。

  4. 垃圾回收器在某个时刻决定回收软可达的对象的时候,会清理软引用,并可选地把引用存放到一个引用队列(Reference Queue) 。类似弱引用,只不过Java虛拟机会尽量让软引用的存活时间长一些, 迫不得已才清理。

  5. 实现一个软引用:

public class Test02 {

    public static void main(String[] args) {
    
        User user = new User();//声明强引用
        SoftReference<User> sf = new SoftReference<>(user);//实现软引用
        user=null;//断开强可达;销毁强引用

        SoftReference<User> sf1 = new SoftReference<>(new User());//一步到位
    }
    
}
4、弱引用

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

面试题:你在开发中用过WeakHashMap吗?

weakHashMap类里面就实现了WeakReference类,主要用来缓存一些图片,当内存不足时,GC就会回收弱引用。

5、虚引用

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值