3

我一直在寻找答案,但我没有找到任何可以 100% 回答我的问题的东西。:D
所以,我需要从一个哈希映射创建其他 3 个新的哈希映射,以 3 种不同的方式交换它的 2 个值(我使用map2.putAll(map1)并稍后切换 2 个值),稍后我必须将哈希映射存储在有序的优先队列中,然后轮询其中之一并重复该过程。

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

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

唯一的限制是准时(这不是问题,100% 确定,已经测试过),它将只用简单的输入进行测试(这已经很好),但我想让它能够做一些困难的事情。

我感谢你的建议。

哦,地图是这样的:<Integer,Integer>并且大小为16. 不幸的是,我不能在这里发布代码,因为作业还没有结束(即使我提交了我的)。

4

3 回答 3

1

很难从描述中准确判断代码中发生了什么,但如果分配和丢弃映射的内存开销是杀死您的原因,您可以缓存 Map 实例并重用它们。使用一些对象池实现,周围有负载,或者如果只有一个线程,则只使用堆栈作为对象池。

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

于 2013-02-01T20:02:39.407 回答
0

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

于 2012-12-03T06:11:16.060 回答
0

如果您能给我们提供有关分配给您的任务的更多细节,这可能会有所帮助……但让我分享一下我对此的看法。

首先,使用 Integer (类)与 int (原语)应该没有太大的错误。它确实使用了更多的内存,但是嘿,它仍然只是整数。除非您有大量的问题,否则您不应该遇到任何问题。HashMap 也一样。信任社区。如果 HashMap 存在严重问题,我们现在就会发现。

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

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

于 2013-02-01T20:24:14.670 回答