提问人:Matteo Rossi 提问时间:11/6/2023 更新时间:11/7/2023 访问量:99
Oracle TemporaryLobs 导致内存泄漏
Oracle TemporaryLobs causes Memory Leak
问:
我们使用 Oracle 21c 作为数据源的 Spring Boot 应用程序 (Spring Boot 2.7.x) 有问题。在执行过程中,我们运行了一系列因使用 Blob 而导致的 OoM。
我们做了一些应用程序转储,结果如下
我们已经了解了 blob 对象如何保存在 temporaryLobs 列表中,该列表由 Oracle 驱动程序直接管理。我们无法使用用于与 Oracle 数据库交互的 Spring Jdbc (5.3.25) 库与此列表进行交互。
有人可以帮助我们吗?
这是我们的 pom.xml 的一个片段
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<version>21.5.0.0</version>
</dependency>
答:
2赞
kfinity
11/7/2023
#1
请参阅此类似问题、此问题或此 Oracle 支持文档。还有这篇 Ask Tom 文章和这篇博文。
一个简短的回答是,当使用临时 lob 完成时,您的 Java 代码不会调用 java.sql.Blob.free() - 并且使用连接池,数据库会话永远不会真正销毁,因此所有 lob 都保留在内存中,直到您重新启动整个应用程序。需要显式释放每个临时 Blob。
评论
0赞
Matteo Rossi
11/8/2023
非常感谢您的建议。有没有办法通过处理属性来推断此行为,而不必在每个 Blob 对象访问中显式使用 free() 方法?
0赞
kfinity
11/10/2023
@MatteoRossi对不起,我不知道。但这是一个很好的问题,这将是解决这个问题的一个非常方便的方法。
上一个:ios在viewcontroller中找不到内存泄漏
下一个:写出边界矩阵
评论