当前位置: 首页 > 知识库问答 >
问题:

JDBC bulkcopy中可能存在内存泄漏

赵晨
2023-03-14

我正在编写一个spring boot 2应用程序,我正在使用SQL批量复制功能在SQL Server2012数据库中插入几条记录。每插入700行,我就有600 MB的泄漏

我已经试用了Microsoft驱动程序版本6.4.0.jre8和7.2.2.jre8,但任何东西都改变了。我尝试为tomcat更改Hikari连接池,但结果是一样的。

为了调用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内存分析器时,我会得到以下结果:

  • 与光:

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

关键词com.zaxxer.hikari.pool.poolentry java.lang.object[]sun.misc.launcher$AppClassLoader@0x81611758“

  • 使用Tomcat:

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

关键字java.lang.object[]sun.misc.launcher$AppClassLoader@0x81614fa0 org.apache.tomcat.jdbc.pool.connectionpool“

共有1个答案

祁嘉木
2023-03-14

不是司机。我在一个方法中使用了一个列表,并希望在方法作用域之后收集该列表。我将引用指定为null(之前我清除了集合),GC可以收集它。

 类似资料:
  • 我正在启用持久性的Kubernetes集群中运行Ignite。每台机器都有一个24GB的Java堆,20GB专用于持久内存,内存限制为110GB。我的相关JVM选项是。在每个节点上运行DataStreamer数小时后,我的集群上的节点达到了它们的k8s内存限制,触发了OOM杀机。运行Java NMT后,我惊讶地发现分配给内部内存的空间数量巨大。 Kubernetes metrics证实了这一点:

  • 我试图将Ignite用作键值对的内存数据库,其值范围从50MB到800MB不等。看起来Ignite通过JVM分配堆空间,它从不清理,即使缓存条目离开堆,被清除,没有连接的客户机和运行的操作。我的机器将无法处理这样的内存消耗,因此我正在寻找一种方法来清理一些内存。 我的测试场景如下: null 我正在使用pyignite瘦客户机,通过python脚本在本地测试Ignite: 该脚本将800 MB的数

  • 问题内容: 我配置了tomcat以使用其他外部开源。 但是,在tomcat运行几分钟后,我得到: 是什么原因造成的? 我要去哪里看?可能是Tomcat上的数据池吗? Tomcat中的线程是什么意思? 已编辑 这是我的全部踪迹。该应用程序似乎在仍在运行时会重新加载其上下文-我不知道为什么! 问题答案: 消息实际上很清楚:某些东西创建了一个类型为type的值-这是一个很好的提示。这很可能意味着框架本身

  • 问题内容: 我收到以下警告: 我在server.js中编写了这样的代码: 如何解决呢? 问题答案: 这是在解释节点eventEmitter文档 这是哪个版本的Node?您还有什么其他代码?那不是正常行为。 简而言之,其:

  • 今天给大家聊聊咱们平时写代码的时候,最常见的String字符串代码,它的一些底层原理,以及使用不当可能引发的内存泄漏的问题,相信对于大家平时日常开发写代码会有一定的帮助。 String字符串在内存里是如何存储的? 首先呢,当我们平时在代码中写下一行String类型的代码时,大家知道这个String字符串在内存里是如何存储的吗?比如这样的一行代码:String username = “zhangsa

  • 也许我不知道如何正确地将领域与可观察对象一起使用,但当我从一个领域创建一个可观察对象并订阅它时,我似乎遇到了领域内存泄漏。我在onDestroy()中关闭领域,并在onPause()中取消订阅可观察的领域。但是,如果我添加并返回以下片段几次(它被添加到backbackback,并在背压时删除): 我注意到,如果我在Android studio中进行几次GC,然后进行堆转储,则会有多个Realm和R