Java内存限制?

时间:2013-11-05 21:42:16

标签: java database memory

我正在开发一个java程序,它将文件解析为列表,然后将数据插入到数据库中。这在具有大量内存的服务器上运行。我需要注意java限制吗?

比如说,在将数据插入数据库之前,我不应该将GB数据解析成列表吗?

5 个答案:

答案 0 :(得分:1)

您需要担心的不仅仅是Java的限制。

有网络带宽使用,占用数据库服务器CPU,填满数据库事务日志,批量插入的JDBC性能,数据库更新索引时生效缓慢或生成人工密钥。

如果你的输入太大,你需要将它们分成块并分别提交块。太大有多大取决于您的数据库。

分配人工密钥的方式可能会降低流程速度,您可能需要提前创建批量值,例如使用hilo生成器。

启动一堆线程并用它们锤击数据库服务器只会引起争用并使数据库服务器更加努力,因为它必须整理事务并确保它们不会相互干扰。

考虑写入某种分隔文件,然后运行批量插入实用程序将其内容加载到数据库中。这样数据库实际上可以合作,它可以暂停更新索引和检查约束,序列和事务不是问题。它比JDBC快几个数量级。

答案 1 :(得分:1)

Nathans的答案很不错 - 所以我只会在这里添加一些内容......

如果你在程序中没有做任何非常复杂的事情,那么以流媒体方式编写可能是一种好习惯 - 简单来说,一次读入输入行,然后直接将其输出到文件中,最后调用数据库的具体(大多数都有一个)批量上传工具。

将所有行读入内存,然后在循环上调用insert()将是非常低效的。

你没有给我们提供很多线索,说明你为什么要一次性阅读这些数据 - 是否有理由需要这样做?

答案 2 :(得分:0)

这取决于您为JVM分配的内存量。

您可以为JVM分配多少内存取决于客户端VM(或)服务器VM类型。

检查-Xmx-Xms settings

答案 3 :(得分:0)

不是直接的,但您可能想稍微调整一下JVM参数。

What are the Xms and Xmx parameters when starting JVMs?可能是一个有用的参考。

答案 4 :(得分:0)

您可能需要注意的限制是

  • 一个列表不能有2 ^ 31个条目或更多。
  • 一个JVM确实可以扩展到32 GB,但不会高得多,因为GC的成本会随着堆大小的增加而增加(除非你有Azul的Zing)

这些天的内存大小是256 - 512 GB,如果在一个JVM(或Zing)中需要超过32 GB,我建议使用off heap内存。