mysql 链接关闭虚引用未清理引擎 JVM内存升高问题及解决

目录

1、现象

2、mysql-connector-java 源码分析

3、解决方法

3.1、配置disableAbandonedConnectionCleanup

3.2、暴力解决方式-----定时GC

4、什么是虚引用

5、关联对象真的被回收了吗

6、虚引用的使用场景——mysql-connector-java 虚引用源码分析

7、参考:

1、现象
最近发现,服务器内存一直在增加,dump内存后发现com.mysql.cj.jdbc.AbandonedConnectionCleanupThread$ConnectionFinalizerPhantomReference占用很多内存,

2、mysql-connector-java 源码分析
使用的 mysql-connector-java 版本(8.0.30)的代码发现对数据库连接的虚引用有新的处理方式,不像老版本(5.1.38)中每一个连接都会生成虚引用,而是可以通过参数来控制是否需要生成。类 AbandonedConnectionCleanupThread 的相关代码如下:

//静态变量通过 System.getProperty 获取配置
private static boolean abandonedConnectionCleanupDisabled = Boolean.getBoolean(“com.mysql.cj.disableAbandonedConnectionCleanup”);

public static boolean getBoolean(String name) {
return parseBoolean(System.getProperty(name));
}

protected static void trackConnection(MysqlConnection conn, NetworkResources io) {
//判断配置的属性值来决定是否需要生成虚引用
if (!abandonedConnectionCleanupDisabled) {
···
ConnectionFinalizerPhantomReference reference = new ConnectionFinalizerPhantomReference(conn, io, referenceQueue);
connectionFinalizerPhantomRefs.add(reference);
···
}
}
mysql-connector-java 的维护者应该是注意到了虚引用对 GC 的影响,所以优化了代码,让用户可以自定义虚引用的生成。

3、解决方法
3.1、配置disableAbandonedConnectionCleanup
When using Connector/J, the AbandonedConnectionCleanupThread thread can now be disabled completely by setting the new system property com.mysql.disableAbandonedConnectionCleanup to true when configuring the JVM. The feature is for well-behaving applications that always close all connections they create.
有了这个配置,就可以在启动参数上设置属性:

java -jar app.jar -Dcom.mysql.cj.disableAbandonedConnectionCleanup=true
或者在代码里设置属性:

System.setProperty(PropertyDefinitions.SYSP_disableAbandonedConnectionCleanup,“true”);
当 com.mysql.cj.disableAbandonedConnectionCleanup=true 时,生成数据库连接时就不会生成虚引用,对 G

你可能感兴趣的:(mysql,jvm,数据库)