gpt4 book ai didi

java - Hsqldb - 内存过度使用?

转载 作者:行者123 更新时间:2023-12-01 06:16:48 28 4
gpt4 key购买 nike

我在服务器内存模式下使用 hsqldb 2.3.2。我遇到一种情况,我向 hsqldb 插入一些信息,并且 HSQLDB 使用的堆空间(即使在 GC 之后)比我将其保存在 java 堆中的普通 HashMap/LinkedList 中大约大 3 到 4 个。

以下是将多条记录插入内存 hsqldb 服务器的代码:

    Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa","");
c.setAutoCommit(false);
PreparedStatement ps = c.prepareStatement("set database sql syntax ora true");
ps.execute();
ps.close();

ps = c.prepareStatement("create table t (x long)");
ps.execute();
ps.close();
c.close();
String x = "insert into t values(?)";
c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa","");
c.setAutoCommit(false);
ps = c.prepareStatement(x);
for(int i=0;i<1000*1000*10000;i++){
long z = new Random().nextLong();
ps.setLong(1, z);
ps.addBatch();
if(i%1000==0){
ps.executeBatch();
ps.clearParameters();
ps.clearBatch();
ps.close();
ps = null;
ps = c.prepareStatement(x);
}
c.commit();
c.close();
if(i%100000 == 0){
System.out.println(i);//print number of rows inserted
c.commit();
c.close();
c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost","sa","");
c.setAutoCommit(false);
ps = c.prepareStatement(x);
}
}

我使用 JVisutalVM 跟踪服务器 HSQLDB 进程并我运行上面的代码,直到发生 OutOfMemory

我尝试了不同的堆大小并停止了上面的代码 - 令人不安的是我总是看到我插入了大约 13,800,000 行 - 在具有 3GB 可用堆的服务器中 - 并且在终止上面的代码并执行 GC 后堆已满0 堆占用 2500MB -

这意味着每行占用大约 180 个字节 - 单个 long 需要 8 个字节 - 因此重量增加了 22 倍。

这当然只是一项测试,真实的表通常不会只有一个字段 - 但我探索这一点的原因是,当我尝试将 1GB 内存从 oracle 复制到 HSQLDB 时 - 在 HSQLDB 中它最终会保留 4GB ! (表结构相同)

现在,问题是:

  1. 发生什么事了?我的测试看起来正确吗?

  2. 如何减少 HSQLDB 中的内存消耗?

  3. 如果没有简单的方法,其他哪些类似产品可能具有合理的内存使用量? H2 在这种情况下表现如何?

谢谢

最佳答案

最后我选择了 H2,它占据了原始大小的 1.2 左右(在我的例子中)。它还具有额外的内存压缩模式。

关于java - Hsqldb - 内存过度使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22679594/

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