我正在从具有大量数据的IO中读取数据,并且需要将数据存储在Map或属性文件中的键值对中,然后我才可以使用该数据生成报告。但是,当我将这些庞大的数据存储在Map或Properties文件中时,堆内存异常即将到来。相反,如果我使用SQLLite,则需要花费非常多的时间来检索它。有没有什么不同的方式来实现这一点。请建议。如何避免Java中的Java堆空间异常
回答
增加堆大小是一个选项,但使用内存映射文件java.You可以参考this
在我们的例子中,我们正在读取来自配置单元的数据,并试图将数据放入地图或根据一些匹配的条件。读取文件后,我们可以使用RandomAccessFile来提供先生。 –
Java堆空间要点
的Java存储堆外的数据替代堆内存是由操作系统分配给JVM的内存的一部分。
每当我们创建对象时,它们都是在Java中的堆内部创建的。
Java堆空间被分为三个区域或一代,为了垃圾收集而被称为新一代,旧的或老生代或彼尔姆空间。永久生成是在热点JVM中在完整gc期间收集的垃圾。
通过使用JVM命令行选项-Xms,-Xmx和-Xmn,可以增加或更改Java堆空间的大小。在指定大小以指示Mega或Gig之后,不要忘记添加单词“M”或“G”。 例如,您可以通过执行以下命令java -Xmx256m javaClassName(您的程序类名称)将java堆大小设置为258MB。
您可以使用JConsole或Runtime.maxMemory(),Runtime.totalMemory(),Runtime.freeMemory()查询Java中编程的堆大小。
您可以使用命令“jmap”在Java中进行堆转储,并使用“jhat”来分析堆转储。
Java堆空间不同于用于存储调用层次结构和局部变量的堆栈。
Java垃圾回收器负责从死对象中回收内存并返回到Java堆空间。
当你得到java.lang.OutOfMemoryError时,不要惊慌,有时它只是增加堆大小的问题,但如果它是经常性的,那么在Java中寻找内存泄漏。
使用事件探查器和堆转储分析器工具来了解Java堆空间以及为每个对象分配了多少内存。
参考链接查看更多细节:
https://docs.oracle.com/cd/E19159-01/819-3681/abeii/index.html
你需要做的的需要为您的地图存储一个粗略的估计。多少个键和值?键和值有多大?例如,如果键长,并且值的字符串平均长度为40个字符,则20亿个键值对的绝对最小值为(40 + 8)* 2E9 - 大约100 GB。当然,真正的要求大于最小估计值 - 根据键和值的性质,要大两倍。
如果估计的内存超出合理范围(100 GB超出了合理范围,除非您有很多钱),则需要找出一种划分处理的方法。你需要读入大量的数据,然后在其上运行一些算法以将其缩小到一定的尺寸。然后逐个处理所有其他块,确保在处理新块时不要将旧块留在周围。最后,查看所有块的结果并计算最终结果。为了更好地描述这种方法,请查看“map-reduce”。
如果估计的内存量有些合理(比如说8 GB - 而且有16 GB的机器) - 使用64位JVM,设置最大堆内存使用-Xmx开关,确保使用最有效的数据结构,如特罗韦地图。
祝你好运!
- 1. Java堆空间异常
- 2. 如何避免java中的空指针异常
- 3. Unix的交换和Java堆空间异常回避
- 4. 避免Java中的特定异常
- 5. 如何通过StringBuilder避免Java OutofMemoryError堆空间循环?
- 6. Excel POI 3.5 WorkBook Java堆空间异常?
- 7. 在Java中8避免NoSuchElementException异常流
- 8. 摆好避免NullPointerException异常在Java中
- 9. 在不增加堆空间的情况下避免java.lang.OutOfMemoryError异常?
- 10. 改进java代码以避免堆内存异常
- 11. 如何避免JBoss服务器中的Perm Gem空间异常?
- 12. Java的堆空间了海量的免费堆空间
- 13. 如何避免空指针异常?
- 14. 我该如何避免Java中的ResultSet被关闭异常?
- 15. 线程“main”中的异常java.lang.OutOfMemoryError:netbeans中的Java堆空间
- 16. 如何在使用java中的串行端口时避免空指针异常?
- 17. 堆空间异常
- 18. 如何在Java中加载cpp库时避免异常?
- 19. 如何避免在java中发生异常时程序终止
- 20. 线程“main”中的异常java.lang.OutOfMemoryError:使用BASE64Decoder的Java堆空间
- 21. 如何避免成功的Hibernate保存之后用完Java堆空间?
- 22. 的OutOfMemoryError(JAVA):Java堆空间
- 23. java堆空间
- 24. java堆空间
- 25. 如何避免在Java中
- 26. 如何避免在java中
- 27. 如何避免响应正文中的异常堆栈
- 28. 如何管理Java中的堆空间
- 29. 如何避免TypeInitializer异常?
- 30. 避免堆栈溢出异常
[Java堆内存错误(可能的重复http://stackoverflow.com/questions/3443937/java-heap-memory-error) – Reinard
对于这种情况,如果我们增加堆,问题仍然存在,请不要增加堆以任何方式给我建议 –
你可以做的是读取数据块的字节,将其存储在地图上,然后进一步处理。从您的问题中我可以看到,您正在读取大量数据并将其存储在地图或属性文件中,因为您正在处理大量数据并充分利用JVM。可能这可能是你获得堆空间异常的原因。试一试大块头 –