我们正在尝试在 RinSim 中实现一个委托 MAS。我们使用CommModel
,CommUser
和CommDevice
将信息从信息素发送给蚂蚁(模拟“闻”信息素)。我们注册信息素(如果信息素被丢弃,则来自CommUser
模拟,如果它蒸发,则取消注册。虽然看起来它们没有从CommModel
(RinSim 的一部分)中的通信设备列表中删除。我们使用分析代码一个工具,结果如下
由“sun.misc.Launcher$AppClassLoader @ 0x8169f378”加载的“com.github.rinde.rinsim.core.model.comm.CommModel”的一个实例占用了 691,677,816 (99.43%) 字节。内存在“sun.misc.Launcher$AppClassLoader @ 0x8169f378”加载的“com.github.rinde.rinsim.util.LinkedHashBiMap”的一个实例中累积。
它随着时间的推移不断增长(尽管我们确实在模拟中取消了信息素的注册)。
我们认为 是LinkedHashBiMap
指 中的 usersDevices 或unregisteredUsersDevices BiMap
。CommModel
我们应该做一些不同的事情来取消注册通讯设备吗?或者这是框架中可能的内存泄漏?
编辑
进一步研究后,课程中确实出现了一个问题CommModel
:取消注册 comm 用户后,用户及其设备被保存在未注册设备/用户列表中,因此如果将来再次注册,他们被分配了相同的设备。虽然这个列表永远不会被清除,所以所有被破坏的蚂蚁都保留在内存中。我们现在使用反射来清除列表,尽管这不是一个好的解决方案。