MySQL 驱动中虚引用 GC 耗时优化与源码分析( 三 )

AbandonedConnectionCleanupThread 实现了 Runnable 接口,在 run 方法里循环读取虚引用队列 referenceQueue 里的虚引用,然后调用 finalizeResource 方法来进行后置的处理,避免连接泄露:
public void run() {while(true) {try {...Reference<? extends MysqlConnection> reference = referenceQueue.remove(5000L);if (reference != null) {//强转为 ConnectionFinalizerPhantomReferencefinalizeResource((ConnectionFinalizerPhantomReference)reference);}...}}}private static void finalizeResource(ConnectionFinalizerPhantomReference reference) {try {//兜底处理网络资源reference.finalizeResources();reference.clear();} finally {//移除虚引用 避免可能造成的内存溢出connectionFinalizerPhantomRefs.remove(reference);}}如果你希望在某些对象被回收的时候做一些后置工作,可以参考 mysql-connector-java 中的一些实现逻辑 。
总结本文简述了一种优雅解决 MySQL 驱动中虚引用导致 GC 耗时较长问题的解决方法、也根据自己的理解讲述了虚引用的作用、结合 MySQL 驱动的源码描述了虚引用的使用场景,希望对你能有所帮助 。




推荐阅读