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()方法。