我的问题简而言之:
任何人都有任何想法?非常感谢!!
更新
答案 0 :(得分:2)
错误诊断这些问题是很常见的。
500 GB应该绰绰有余,假设你有超过500 GB的主内存,交换不行。
如果你有字符串,20 GB的文件可能会有很大的扩展比例。例如16个字符的字符串将使用大约80个字节的内存.A Double
在64位JVM中使用大约24个字节,而不是您可能期望的8个字节。
HashMap和TreeMap每个条目使用大约24个额外字节。
使用readLine()并将容量加倍可以。实际上,预期大小* 4/3就足够了,但它总是使用下一个2的幂。
设置-Xms
确实预先分配了特定的内存(或几乎是那个数字,它通常在1%的时间内没有明显的原因)
每分钟2 M线非常慢。它表明你的开销已经非常高了。我会寻找接近每秒100万行的东西。
与JVM的大小相比,1600万条目无关紧要。我的猜测是你已经开始交换了,你看到的错误是因为GC花了太长时间,而不是因为堆太满了。
你有多少免费主内存?例如在top
中,您在应用程序死亡后看到了什么。
答案 1 :(得分:1)
问题解决了:
对不起,谢谢你的回答!
答案 2 :(得分:0)
你说你有500GB的RAM。您不应将Xmx设置为500 GB,因为这只是堆大小。 VM本身也有一些内存开销。所以不建议完全设置所有内存。
我建议使用例如JVisualVM来分析您的应用程序。或者让heapdump知道内存中究竟是什么。也许有些东西没有清理干净。