3c75e6cbd467f2fe20ca416a44d8d49.png
    运行时异常:超出了GC开销限制。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。一般是因为堆太小,导致异常的原因:没有足够的内存。
    解决思路:
    一般是代码的问题。检查代码中是否使用多线程、是否存在死循环的情况等。

    在我的代码中(如下),由于在代码里使用了多线程异步处理,创建线程数太多。循环100次就创建100个线程。导致GC来不及销毁释放内存,就频繁请求接口,导致内存溢出。

    1. List<CompletableFuture<DictTree>> completableFutureList = new ArrayList<>();
    2. for (int i=0;i<100;i++) {
    3. CompletableFuture<DictTree> completableFuture = institutionElementService.getElementAuditTree();
    4. completableFutureList.add(completableFuture);
    5. }
    6. CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[completableFutureList.size()])).join();

    优化点:检查了代码内容,其实线程处理的内容并不多,可以单线程串行处理。或者分批次处理(串行并行同步处理)。

    1. for (int i=0;i<100;i++) {
    2. institutionElementService.getElementAuditTree();
    3. }

    线程创建和销毁次数太多不仅耗时还耗内存,导致服务中请求会越来越慢。