几种引用和一些名词

本文详细介绍了Java中的垃圾回收机制,包括System.gc()的调用、内存溢出(OOM)、内存泄露的概念,以及Stop-the-World现象。讨论了安全点、安全区域在并发GC中的作用,并解释了强引用、软引用、弱引用和虚引用的区别和应用场景。此外,还提到了引用队列在监控GC状态中的角色和 finalize() 方法的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

System.gc()的理解

调用system.gc()或者Runtime.getRuntime().gc(),会触发Full GC ,同时对老年代和新生代进行尝试回收无法保证对垃圾收集器的调用

内存溢出

内存溢出(OOM):在OOM之前会进行垃圾回收,如果内存还是不够,就报OOM。

特殊情况:分配一个超大对象,超过了堆的大小,直接报OOM。

内存泄露

对象不被用到,但是被引用,无法回收,叫做内存泄露。

举例:单例模式中,单例的生命周期很长,如果对调用外部对象的引用,则会导致内存泄露。

Stop the World

GC时整个用户线程会停下来。

垃圾回收的并行与并发
安全点Safepoint

程序执行时并非所有点(时间点)都能停下来执行GC,只有特定位置(安全点)才能停下来GC

如何在GC时,保证所有线程都在安全点?

抢断式中断(目前没有虚拟机采用)

中断所有线程,如果某个线程不在安全点,恢复他,跑到安全点再停。

主动式中断

设置中断标志,线程跑到安全点时,主动轮询这个标记,如果中断标志为真,自己中断挂起。

安全区域

安全区域是指,一段代码片段中,对象的引用不会发生变化,这个区域任何时候开始GC都是安全的。

实际执行时:线程运行到安全区域时,如果此时发生GC,JVM会忽略这个线程(忽略就是停止执行,开始执行GC)

几种不同的引用

面试题:强引用,软引用,弱引用,虚引用有什么区别,具体使用场景?

强软弱虚,强度依次递减。

Reference是父类,强软弱虚是子类。

强引用:垃圾回收器不会回收
object obj1=new object();

object obj2=obj1;
软引用:OOM前,会进行GC,把软引用对象回收。内存足够时,GC不会回收软引用对象。实现缓存。
Object obj=new Object();
SoftReference<Object> sf=new SoftReference(obj);
obj=null;   //一定要取消强引用才能变成软引用,不然有强引用顶着。
sf.get();//软的get方法获取实体对象
弱引用:不管内存够不够,GC就被回收。实现缓存。
WeakReference<Object> wk=new WeakReference(new Object());//同上
wk.get();//弱引用的get方法获取实体对象
虚引用:虚引用不能获得对象实例,完全不影响对象生存,唯一作用是对象被回收时收到系统通知。
PhantomReference<Object> phantom=new PhantomReference(new Object());//同上
Phantom.get();//注意:获得null

虚引用必须和引用队列一起使用,当GC这个对象时,发现其还有虚引用,那么会把虚引用加入引用队列,通知应用程序对象的回收情况

引用队列(ReferenceQueue)

引用队列可以配合软引用、弱引用及虚引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。

作用:通过引用队列可以了解JVM垃圾回收情况。

终接器引用

实现对象的finalize()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值