Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Oracle XMLType和BinXMLProcCache导致内存泄漏?_Java_Oracle_Memory Leaks - Fatal编程技术网

Java Oracle XMLType和BinXMLProcCache导致内存泄漏?

Java Oracle XMLType和BinXMLProcCache导致内存泄漏?,java,oracle,memory-leaks,Java,Oracle,Memory Leaks,我对Oracle DBs缺乏经验,但现在我正在调查一个有趣的问题。 我认为XMLType类使用的BinXMLProcCache对象中泄漏的T4C连接有问题。 谷歌说他对这对关键词一无所知:XMLType“BinXMLProcCache”内存泄漏,所以我在这里寻求帮助。 简而言之,问题细节:Spring的JdbcTemplate用于处理数据源。Oracle ojdbc6 11.2.0.3.0,xdb6 11.2.0.3.1 public SomeDoc store(Document doc) th


我对Oracle DBs缺乏经验,但现在我正在调查一个有趣的问题。
我认为XMLType类使用的BinXMLProcCache对象中泄漏的T4C连接有问题。
谷歌说他对这对关键词一无所知:XMLType“BinXMLProcCache”内存泄漏,所以我在这里寻求帮助。 简而言之,问题细节:Spring的JdbcTemplate用于处理数据源。Oracle ojdbc6 11.2.0.3.0,xdb6 11.2.0.3.1

public SomeDoc store(Document doc) throws DataAccessException, JAXBException {
    XMLType xmlType = null;
    Connection connection = null;
    SomeDoc someDoc = null;
    try {
        LOGGER.info(doc.toString());
        MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
                                     //I've hided some fields
        mapSqlParameterSource.addValue("F1", something, Types.VARCHAR);
        //... more fields
        StringWriter stringWriter = new StringWriter();
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(doc.getData(), stringWriter);
        String xml = stringWriter.toString();
        try {
            connection = dataSource.getConnection();
            OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
            xmlType = XMLType.createXML(oracleConnection, xml);
        } catch (SQLException e) {
            LOGGER.error(e.getMessage(), e);
            throw new UncategorizedSQLException("XML conversion error", "", e);
        }
        mapSqlParameterSource.addValue("FIELDS", xmlType);
        //... and some more fields
        namedParameterJdbcTemplate.update(SQL_STORE, mapSqlParameterSource);

        someDoc = namedParameterJdbcTemplate.queryForObject(SQL_GET_DOC_BY_REF,
                new MapSqlParameterSource("DOC_REF", doc.getDoc_ref()), someDocRowMapper);
    } finally {
        if (xmlType != null) {
            try {
                xmlType.free();
            } catch (SQLException e) {
                LOGGER.error(e.getMessage(), e);
            }
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                LOGGER.error(e.getMessage(), e);
            }
        }
        if (xmlType != null) {
            xmlType.close();
        }
    }
    return someDoc;
}
我已经使用EclipseMat查看了堆转储的内容,并注意到一些有趣的情况:内存中有很多T4C连接。 未来的调查让我看到了这张照片: (由于声誉不好,我最多只能发布两个链接,所以我的dropbox相册中有图片,对不起)。
所以,我已经阅读了,现在我明白了Oracle选择的方式:以内存换取性能。

但我现在也在想,如果池驱逐空闲一段时间的连接(看看dbcp的minIdle和maxIdle选项),内存中会有一些新连接的增长。由于所有这些都是通过内存中的缓冲区来提高驱动程序性能的,BinXMLProcCache会造成内存泄漏。它的关键是T4C连接,现在价值无关紧要。BinXMLProcCache存储在XMLType的静态字段中,它存储WeakHashMap,我认为这些键永远不会被清除,它会造成内存泄漏。
我的调查正确吗?
提前谢谢

/*找到了我自己的问题,并将自己回答,因为这个问题存在解决方案*/ 因此,问题确实出在Oracle的驱动程序中。
从Oracle站点:

Bug 17537657 Memory leak from XDB in oracle.xdb.SoftHashMap The fix for 17537657 is first included in 12.2 (Future Release) 12.1.0.2 (Server Patch Set) 12.1.0.1.4 Database Patch Set Update 12.1.0.1 Patch 11 on Windows Platforms Description When calling either getDocument() using the thin driver, or getBinXMLStream() using any driver, memory leaks occur in the oracle.xdb.SoftHashMap class. BinXMLProcessorImpl classes accumulate in this SoftHashMap, but are never removed. 错误17537657 oracle.XDB.SoftHashMap中的XDB内存泄漏 17537657的修复首先包含在 12.2(未来版本) 12.1.0.2(服务器修补程序集) 12.1.0.1.4数据库修补程序集更新 12.1.0.1 Windows平台上的修补程序11 描述 使用精简驱动程序调用getDocument()或getBinXMLStream()时 使用任何驱动程序,oracle.xdb.SoftHashMap类中都会发生内存泄漏。 BinXMLProcessorImpl类在这个SoftHashMap中累积,但永远不会 远离的。
所以,只要应用Oracle的修复程序,问题就会消失。

我已经更新了关于WeakHashMap的知识:基于哈希表实现的映射接口,带有弱键。WeakHashMap中的条目在其密钥不再正常使用时将自动删除。更准确地说,给定密钥映射的存在不会阻止垃圾收集器丢弃该密钥,也就是说,使其可终结、终结,然后回收。当一个键被丢弃时,它的条目将被有效地从映射中删除,因此这个类的行为与其他映射实现有所不同。“但这仍然无关紧要,因为WeakHashMap可以增长到没有更多内存为止。这意味着键也是弱链接的,但这仍然无关紧要,因为我们场景中的WeakHashMap将增长到没有更多内存为止。只有到那时它才会开始释放它的钥匙。我的意思是,你们给应用程序的内存并没有什么不同。它总是充满了未使用的垃圾。