我在 NetBeans Profiler 中观察到,在执行查询后,Surviving Generations 不断增加:
@Select("SELECT * FROM ais_dynamic WHERE rep_time >= #{from} AND rep_time <= #{to} AND ais_system = #{sys}")
@Options(useCache=false,fetchSize=8192)
List<AisDynamic> getRecords(
@Param("from") Timestamp from,
@Param("to") Timestamp to,
@Param("sys") int sys);
就好像列表中的对象永远不会被释放,尽管它们没有在其他任何地方使用,并且应该随着后台线程运行查询并处理其结果而死。
下面是 NetBeans Profiler 返回的实时结果:
我的问题:
- 如何防止内存泄漏?
- 我怎样才能优化这个查询,因为可以看到我开始玩
Options
虽然这并不能防止内存泄漏?
如果需要什么,请告诉我什么,我会提供。
更新:
经过更多测试后,我更担心问题在于 MyBatis 持有对检索结果的引用,因此它们不会随着时间的推移而被垃圾收集。在进行了 20 次查询调用然后等待后,我观察到即使在 30 分钟后也没有垃圾收集。我所做的就是调用该方法:List<AisDynamic> adList = mapper.getRecords(from, to, sys);