Java JDBC bulkcopy中可能存在内存泄漏

Java JDBC bulkcopy中可能存在内存泄漏,java,spring-boot,memory-leaks,sql-server-2012,sqlbulkcopy,Java,Spring Boot,Memory Leaks,Sql Server 2012,Sqlbulkcopy,我正在编写一个Spring Boot 2应用程序,并使用SQL批量复制功能在SQL Server 2012数据库中插入多条记录。 每次插入~700行时,我的泄漏量为600 MB 我试过Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但一切都变了。 我曾尝试将Hikari连接池更改为tomcat连接池,但结果是一样的 为了调用Microsoft API,我使用了包装器框架,但代码是干净的: public void saveAllConnection连接、SQLServer

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

我试过Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但一切都变了。 我曾尝试将Hikari连接池更改为tomcat连接池,但结果是一样的

为了调用Microsoft API,我使用了包装器框架,但代码是干净的:

public void saveAllConnection连接、SQLServerBulkCopyOptions选项、流实体{ //在给定连接上创建新的SQLServerBulkCopy实例: 尝试SQLServerBulkCopy SQLServerBulkCopy=新建SQLServerBulkCopyconnection{ //设置选项: sqlServerBulkCopy.SetBulkCopyOptions; //要写入的目标表: sqlServerBulkCopy.setDestinationTableNamemapping.getTableDefinition.GetFullQualifiedTableName; //要插入的SQL记录: ISQLServerBulkRecord记录=新建SqlServerRecordmapping.getColumns,entities.iterator; //最后启动批量复制过程: sqlServerBulkCopy.writeToServerrecord; //处理异常: }捕获SQLServerE异常{ //将其包装在RunTimeException中以提供一个漂亮的API: 抛出新的RuntimeExceptionOne; } } 当我使用Eclipse内存分析器时,我得到以下结果:

与Hikari一起: 加载的com.zaxxer.hikari.pool.PoolEntry的一个实例 sun.misc.Launcher$AppClassLoader@0x81611758占用640.619.616 95,94%字节。内存累积在一个实例中 加载的java.lang.Object[]

关键词com.zaxxer.hikari.pool.PoolEntry java.lang.Object[] sun.misc.Launcher$AppClassLoader@0x81611758

使用Tomcat: 已加载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 previous,我清除了收集,GC可以收集它。

您如何知道这是泄漏,而不是GC尚未回收的内存?调用close并不能保证立即从内存中删除所有数据。我正在强制执行GC,600 MB的间隔不会改变。Eclipse内存分析器还检测到它可能存在泄漏