使用jdbc8.jar和Oracle客户端18时,本机内存分配(mmap)无法映射

HRaz:

我有一个Java应用程序,可从Oracle 11g数据库11.2.0.4.0版(使用Spring 4)提取大型xml并将其存储在文件中。我们在提取包含多字节字符的数据时遇到问题。根据多字节在xml中的位置,有时会将多字节分成两部分。看来问题出在与jdbc的版本和安装的oracle客户端有关。因此,我们迁移到Oracle客户端18和ojdb8.jar,使代码保持不变。多字节问题已解决,但是现在我们遇到了以前未发生的内存问题。我得到的错误是:

没有足够的内存让Java Runtime Environment继续运行。

本机内存分配(mmap)无法映射256376832字节以提交保留的内存。

我玩过java命令参数,但无济于事。这就是我正在运行的内容:java -Dfile.encoding = UTF8 -Doracle.jdbc.timezoneAsRegion = false -Xmx10240m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / tmp -XX:NativeMemoryTracking = detail -XX:+ StartAttachListener -XX: + UnlockDiagnosticVMOptions -XX:+ PrintNMTStatistics

Xmx减少到512m最终导致堆内存不足。

我使用jcmd VM.native_memorybaseline / summary.diff和GC.class_stats监视了应用程序的内存,最大的内存使用者之一是String对象。我无法理解其余的一切。

的SQL是:SELECT XML_DATA FROM table where ....

xml_data列定义为:XML_DATA NOT NULL SYS.XMLTYPE STORAGE BINARY

在Java中将此映射到oracle.xdb.XMLType:

public List<XMLType> extractXmlDataList(String sqlExtractionQuery, Key key) {
    MapSqlParameterSource namedSqlParams = createKeyParamMap(key);
    List<XMLType> dataList = namedParameterJdbcTemplate.queryForList(sqlExtractionQuery, namedSqlParams, XMLType.class);
    return dataList;
}


protected void extractXmlData(Key key) {
List<XMLType> xmlRecs = producerDao.extractXmlDataList(sqlExtractionQuery, patentKey);
    if (xmlRecs != null && xmlRecs.size() > 0) {
        for (XMLType xmlData : xmlRecs) {
            String xmlText = xmlData.getStringVal();
            //create nu.xom.Document
            Builder parser = new Builder();
            Document xmlDocument = parser.build(xmlText, null);
        }
    }       
}

迁移到Oracle客户端18和jdbc8.jar怎么会对内存消耗产生如此大的影响?

HRaz:

通过使用xmlserialize而不是Oracle Java XMLType对象解决了内存问题。仍在使用Oracle客户端18和ojdbc8.jar。多字节UTF8拆分没有其他问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

阅读和写作插槽和文件只使用本机内存?

JDK8无法与JDK8一起使用(WS客户端)

在EJB 3和设计模式中使用客户端jar

在JDBC for Oracle中设置客户端信息

使用pmap和gdb查找本机内存泄漏

使用JDBC客户端进行抓取时MySQL的UNSIGNED BIGINT问题

使用ArrayBinding插入Oracle上的表时,客户端应用程序挂起

在跨架构运行查询时,Oracle客户端会使用多少数据/网络?

Angular:使用新的http客户端映射HTTP响应

使用mmap API时,内存映射长度的意义是什么?

用Apollo响应本机授权:使用令牌创建客户端。无法将令牌设置为标头

使用即时客户端通过Python3(cx_Oracle)连接到Oracle数据库时,错误“ DPI-1047:无法找到64位Oracle客户端库”

为什么在服务器端和客户端同时调用recv和发送功能时使用客户端的文件描述符?

重复映射和取消映射单个页面时,mmap()无法分配内存

如何在Meteor中使用本机客户端库?

与多个客户端一起使用共享内存和信号量

使用Maven和cxf-codegen-plugin将JAR中的WSDL客户端打包

如何在本机客户端中使用CORS机制

Apache Drill 0.9和SQuirreL SQL客户端-无法列出JDBC驱动程序

PostgreSQL:使用JDBC跳过SQL客户端中的错误

无法使用本机客户端11(SQLNCLI11)连接到SQL命名实例

如何使用内存映射文件在同一台计算机上的服务器和客户端之间进行通信?

在OSX 10.12上使用mmap()时出现“无法分配内存”错误

ORA-29481:从JDBC调用Oracle 12c过程时,隐式结果无法返回给客户端

Fabric8:用于 openshift 和 kubernetes java 客户端的 OSGI 捆绑 jar

RJDBC - 无法使用 JDBC Uri 打开客户端传输

Hive PAM 无法使用 JDBC 打开客户端传输

客户端验证无法使用 MongoDB

在 ml-engine 中使用 cx_oracle 导致“无法加载 Oracle 客户端库”