gpt4 book ai didi

java - 在从 Oracle 数据库存储数据期间管理 JAVA 堆大小

转载 作者:行者123 更新时间:2023-11-29 04:38:22 26 4
gpt4 key购买 nike

我需要通过遍历结果集(Oracle 数据库)在内存中存储大量数据。

我进行了一些测试,通过使用分析器,我注意到 heap sizeused heap(即我的数据)之间存在相当大的差异.这里有一个例子。

enter image description here

我已经看到了可用的 JVM 参数来设置正确的堆大小,但问题是我事先不知道数据将占用多少字节(因为数据量可能因测试而异).

通过观察图像中的图形,问题似乎是执行过程中的内存“峰值”。

这些峰值是否与获取的行数有关(或者通常与提取的数据有关?

有没有办法通过保持内存几乎不变(以便堆大小不会过度增加)来避免这种影响?

谢谢

最佳答案

通过查看您的内存图表,似乎大部分数据都是临时性的,可以在某个时候从堆中删除。已用堆与其总大小的最终比率说明了一切。

似乎临时数据(例如来自 Oracle ResultSet 的缓冲数据)生存时间太长或 eden 空间太小,因此数据正在从 eden 和/或 survivor 空间移动到 old generation 空间,由于 JVM 检测到需要运行而被收集old generation 空间上的 GC。当您迭代 ResultSet 并且 Oracle 驱动程序需要从数据库中获取下一个数据 block 时,这可能会发生,该数据 block 可能相当大。

此时我应该详细介绍一下 Oracle ResultSet 缓冲区。它基本上只是堆上的一大块字节。根据列数据,它存储为不同于您从 ResultSet 中读取的内容。以 java.sql.Timestamp 为例。在缓冲区内,它存储为 oracle.sql.TIMESTAMP。甚至只是普通字节。这意味着无论何时从 ResultSet 中提取 java.sql.Timestamp,都需要分配另一个对象。而这个对象很可能是您最终想要保留的“最终”对象。

我建议根据您的需要调整 JVM 的 GC。也许您可以弄清楚正在不断收集哪些数据。尝试调整 eden 大小,这样 JVM 就不需要向 old generation 提升太多。您还可以调整 JVM 按需分配多少新空间,以及在检测到使用量和分配大小之间的差距时如何收缩。

您可以找到 JVM 选项列表 here .

关于java - 在从 Oracle 数据库存储数据期间管理 JAVA 堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40284154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com