超出了Java GC开销限制。大量的哈希图和优先级。我能做什么?

时间:2012-11-18 19:56:27

标签: java garbage-collection limit overhead

我已经找到了答案,但我找不到任何可以100%回答我问题的答案。 :d
所以,我需要从一个hashmap创建其他3个新的hasmaps,以3种不同的方式交换它的2个值(我使用map2.putAll(map1)然后切换2个值),稍后我必须将hashmaps存储在有序的priorityqueque中,然后轮询其中一个并重复该过程。

问题开始了,因为我必须做很多次,因为不满足特殊条件......并且没有办法减少我做的地图数量(好吧,我可能会阻止被欺骗的地图,但是我认为这将是非常昂贵的:/)。

实际上,我真的不介意我是否存储了所有地图(从我读到的内容,我发现这是GC的错误)或者我是否需要做其他技巧......我只想让我的代码正常工作,没有(如果可能的话)使用'-XX:-UseGCOverheadLimit'这样的东西,因为它是一种作业(即使没有标记),它必须与提示符中的'java classname'一起使用。

唯一的限制是准时(这不是问题,100%肯定它,已经测试过),它将只用简单的输入进行测试(其中已经很好),但我想制作它甚至可以做到很难。

我在建议中感谢你。

哦,地图属于这种类型:<Integer,Integer>,大小为16。不幸的是,我不能在这里发布代码,因为家庭作业尚未结束(即使我提交了我的作品)。

3 个答案:

答案 0 :(得分:1)

很难从描述中判断出代码中发生了什么,但是如果分配和删除映射的内存开销正在扼杀你,那么你可以只缓存Map实例并重用它们。使用一些对象池实现,周围有负载,或者只使用一个堆栈作为对象池,如果只有一个线程。

你遇到的另一个问题是使用Integer会导致大量的内存流失,而且由于Integer是不可变的,这有点痛苦。使用Trove int/int地图替换您的地图,然后进行排序:)

答案 1 :(得分:0)

HashMaps在内存方面很昂贵:只有在需要从大型数据集中快速搜索时才使用它们。 “并且大小为16”看起来根本不需要Hashmaps。

答案 2 :(得分:0)

如果你能给我们一些关于给你的任务的更多细节可能会有所帮助......但是让我分享一下我对此的想法。

首先,使用Integer(类)与int(原语)不应该有太多错误。它 使用更多内存,但是它仍然只是整数。你不应该遇到任何问题,除非你有大量的卡车。对于HashMap也是如此。相信社区。如果HashMap存在严重问题,我们现在就会发现。

听起来像你有内存泄漏。检查你的程序。你说你不想提高内存限制(如果你问我,明智的决定),但你可能会尝试这只是为了测试。如果你确实有内存泄漏,你的程序只会运行一段时间,然后再给你完全相同的问题。有专门用于检测内存泄漏的工具,但只需使用标准的Windows进程管理器并随着时间的推移密切关注程序的内存消耗,就可以很快发现是否有泄漏。如果你的程序一遍又一遍地做同样的事情,你应该期望内存消耗相对稳定。随着内存被垃圾收集器再次分配和收集,它会随着时间的推移而上下移动,但这应该保持在相当稳定的带宽内。

如果您确信没有内存泄漏,那么您可能以错误的方式解决了问题。例如,处理文件的简单实现可能会将文件读入内存,处理它然后再将其保存回来......但如果文件大小为1GB,则该方法将消耗1GB内存仅用于存储加载的数据。如果它需要能够处理大量数据,请不要一次处理,而是以块的形式工作。将部分文件数据读入缓冲区,处理它,清除处理过的数据并读取下一个chunck。这样您的应用程序就可以处理任何大小的文件。这只是一个例子,但这种东西是典型的内存问题。要么你有泄漏,要么你的方法是错误的。只有那些巨大且可以处理大量数据的程序才能达到内存限制。大多数程序都不是那样的。他们只是有内存泄漏或使用错误的方法来解决问题。

相关问题