强引用
- 被GC ROOTS强引用的对象需要在所有强引用断开后才可被GC
软引用
- 被GC ROOTS软引用对象只有再可能发生内存泄漏的时候,才会被GC
- 可配合引用队列
弱引用
- 只要发生GC就会被回收
- 可配合引用队列
虚引用
- 虚引用一般指的是配合ByteBuffer使用,虚引用的引用者被回收的时候,虚引用对象进入引用队列,Reference Handler线程调用相关方法释放直接内存
- 必须配合引用队列
终结器引用
-
终结器引用的引用这被回收的时候,会讲终结器引用放入引用队列,暂不回收,之后会有一个优先级极低的线程Finalizer来调用其.runFinalization(),之后第二次GC的时候再释放它的内存
static void runFinalization() { if (!VM.isBooted()) { return; } forkSecondaryFinalizer(new Runnable() { private volatile boolean running; public void run() { if (running) return; final JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); running = true; for (;;) { Finalizer f = (Finalizer)queue.poll(); if (f == null) break; f.runFinalizer(jla); } } });
-
必须配合引用队列