我正在使用Spring的spring-boot-starter-data-jpa
maven依赖项来自动生成我们的存储库并且没有进行额外的调整 - 我的存储库现在看起来都像:
public interface AssetTripRepository extends CrudRepository<Asset, String> {
}
在调用类中,我按如下方式注入存储库:
@Autowired
public CacheService(final AssetTripRepository assetTripRepository) {
this.assetTripRepository = assetTripRepository;
}
然后使用它:
for (final Asset asset : assets) {
final ArrayList<AssetTrips> assetTrips = //call to service
assetTripRepository.save(assetTrips);
}
这一切都可以工作并持久存储到数据库,但是存储库似乎没有释放对象(assetTrips),即使它们已经被保存,最终会导致内存不足。
我已经使用了VisualVM内存采样器并且可以验证所有assetTrip对象总是在堆上并且永远不会被垃圾收集,注释掉assetTripRepository上的save调用修复了这个问题并且所有assetTrips都被垃圾收集所以它只能是由于某种原因,存储库保留了这些引用。
我希望在循环通过资产的每次迭代之后,assetTrips持续被解除引用并且有资格进行垃圾收集,但这种情况并没有发生。