记一次Spring Data Jpa引起的OutOfMemoryError

记一次Spring Data Jpa引起的OutOfMemoryError

OOM场景

使用框架

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
      <version>2.1.0.RELEASE</version>
    </dependency>

设置jvm参数-Xms200m -Xmx200m,方便快速出现OOM

jpa分页查询

  @Override
  public Resource testJpaOom() {
    int page = 0;
    Page<OrderDO> orderDOPage = orderDao
        .findAll(PageRequest.of(page, OrderConstants.DEFAULT_SIZE));
    int totalPages = orderDOPage.getTotalPages();
    for (; page < totalPages; page++) {
      log.info("start totalPages:[{}],page:[{}]", totalPages, page);
      orderDao.findAll(PageRequest.of(page, OrderConstants.DEFAULT_SIZE));
      log.info("end totalPages:[{}],page:[{}]", totalPages, page);
    }
    return null;
  }

OOM异常

image.png

Exception in thread "http-nio-8086-exec-1" java.lang.OutOfMemoryError: GC overhead limit exceeded

修复

  @Override
  public Resource testJpaOom() {
    int page = 0;
    Page<OrderDO> orderDOPage = orderDao
        .findAll(PageRequest.of(page, OrderConstants.DEFAULT_SIZE));
    int totalPages = orderDOPage.getTotalPages();
    for (; page < totalPages; page++) {
      log.info("start totalPages:[{}],page:[{}]", totalPages, page);
      orderDao.findAll(PageRequest.of(page, OrderConstants.DEFAULT_SIZE));
      log.info("end totalPages:[{}],page:[{}]", totalPages, page);
      // 清除持久上下文环境
      entityManager.flush();
      entityManager.clear();
    }
    return null;
  }

image.png

总结

托管状态下的bean不会被垃圾回收。关于jpa下bean的状态可以参考

https://my.oschina.net/u/4107179/blog/3041238

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值