????FinalReference????
?????????????package????????????????????????????????Reference?? ???????????????????????????????????????е?????????????????????????????referqyebceQueue????.
????????????????????finalize????????????????????????????????????????????????finalRefernece????.
???????finalize??????object?????????????????.????????д????????????????????????.????????????????????.??finalize????????????????????????????????finalRefernece??.
??????????????????newInstance???????????object??????????????????????????????.
????Finalizer#register????
?????????????????????????????finalizer??????finalizer??????????finalReference??.?????????????:
????/* Invoked by VM */
????static void register(Object finalizee) {
????new Finalizer(finalizee);
????}
????????????????????????????jvm???????????.
????????л???Finalizer????????????????:
????private Finalizer(Object finalizee) {
????super(finalizee?? queue);
????add();
????}
?????????????????????????????queue???л??.add??????????????л?δ????finalize???????????????????System.shutdown?????.???Runtime#runFinalizersOnExit????????.
????ReferenceQueue
????????????л??????reference????????????????????????????(????????????????reference???????.)??????????????????????????????????????????????????.
???????????????????????finalize????????.
????FinalizerThread???
?????????????queue???棬???????????????????????finalize????.???????????????:
for (;;) {
try {
Finalizer f = (Finalizer)queue.remove();
f.runFinalizer(jla);
} catch (InterruptedException x) {
// ignore and continue
}
}
???????????runFinalizer???????:
synchronized (this) {
if (hasBeenFinalized()) return;
remove();
}
try {
Object finalizee = this.get();
if (finalizee != null && !(finalizee instanceof java.lang.Enum)) {
jla.invokeFinalize(finalizee);
/* Clear stack slot containing this variable?? to decrease
the chances of false retention with a conservative GC */
finalizee = null;
}
} catch (Throwable x) { }
super.clear();
?????????????????У????????remove?????δfinalize?????.???????????????????finalize???????????Σ????????ε???????.?????????????????hasBeenFinalized?????true(???????????next?????????.???????δfinalize?????????????????ε???finalize??).
????????????????????finalize???????????jla.invokeFinalize????????????????finalize????. ??????????У????????get?????????.??????jvm?????У????finalizeReference????????????????????????null.?????????????????????????????.
???????????????????????clear??????????????.?????????????????????????????Ч??.
????????????????У?????????????finalize?????.??????????????????finalize???????????????????????????У??????????????OOM????.??????????????????????дfinalize????????????????????????????????.????guava?е?FinalizableReference.