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