JDBC 大容量复制中可能存在内存泄漏



我正在编写一个 Spring Boot 2 应用程序,并且正在使用 SQL 批量复制功能在 SQL Server 2012 数据库中插入多条记录。 每次我插入~700行时,我都有600 MB的泄漏

我已经尝试Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但有任何变化。 我尝试将光连接池更改为雄猫连接池,但结果是一样的。

为了调用Microsoft API,我使用的是包装框架(https://github.com/bytefish/JSqlServerBulkInsert),但代码很干净:

public void saveAll(Connection connection, SQLServerBulkCopyOptions options, Stream<TEntity> entities) {
// Create a new SQLServerBulkCopy Instance on the given Connection:
try (SQLServerBulkCopy sqlServerBulkCopy = new SQLServerBulkCopy(connection)) {
// Set the Options:
sqlServerBulkCopy.setBulkCopyOptions(options);
// The Destination Table to write to:
sqlServerBulkCopy.setDestinationTableName(mapping.getTableDefinition().GetFullQualifiedTableName());
// The SQL Records to insert:
ISQLServerBulkRecord record = new SqlServerRecord<TEntity>(mapping.getColumns(), entities.iterator());
// Finally start the Bulk Copy Process:
sqlServerBulkCopy.writeToServer(record);
// Handle Exceptions:
} catch (SQLServerException e) {
// Wrap it in a RunTimeException to provide a nice API:
throw new RuntimeException(e);
}
}

当我使用 Eclipse 内存分析器时,我得到以下结果:

  • 与光:

"com.zaxxer.hikari.pool.PoolEntry"的一个实例加载者 "sun.misc.Launcher$AppClassLoader @ 0x81611758" 占用 640.619.616 (95,94 %) 字节。内存在 "java.lang.Object[]" 由 " 加载。

Keywords com.zaxxer.hikari.pool.PoolEntry java.lang.Object[] sun.misc.Launcher$AppClassLoader @ 0x81611758 ">

  • 使用雄猫:

"org.apache.tomcat.jdbc.pool.ConnectionPool"的一个实例已加载 由 "sun.misc.Launcher$AppClassLoader @ 0x81614fa0" 占用 640.805.840 (95,92 %) 字节。内存在由 " 加载的 "java.lang.Object[]" 的一个实例中累积。

关键字 java.lang.Object[] sun.misc.Launcher$AppClassLoader @ 0x81614fa0 org.apache.tomcat.jdbc.pool.ConnectionPool">

不是司机。我在方法中使用了一个列表,并希望在方法范围之后收集。我将引用分配给 null(之前我清除了集合),GC 可以收集它。

最新更新