Skip to content

Spring WebFlux "ResourceLeakDetector:LEAK" #25213

Closed
@xuep2006

Description

@xuep2006

Spring Boot Version

spring-boot-starter-webflux:2.1.14.RELEASE
spring-boot-starter-reactor-netty:2.1.14.RELEASE
reactor-netty:0.8.18.RELEASE
jdk 1.8.0_162

Problem

Hi,
I am using jmeter to test the performance of a microservice, the test case is:

  • Running the application with -Dio.netty.leakDetectionLevel=paranoid .
  • Jmeter uses 50 threads to start performance testing.
  • Force stop jmeter in the testing.
  • Start the performance testing again.

An exception occurs: io.netty.util.ResourceLeakDetector:LEAK: ByteBuf.release() was not called before it's garbage-collected.
When I remove the subscribeOn in the code, no exception occurs.

Code

  • MyApplication
@SpringBootApplication
@EnableWebFlux
@Configuration
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(MyApplication.class);
        app.run(args);
    }

    @Bean
    public Scheduler requestScheduler() {
        ExecutorService executorService =
            new ThreadPoolExecutor(1024, 1024, 60, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
        return Schedulers.fromExecutorService(executorService);
    }
}
  • MyController
@RestController
public class MyController {

    @Autowired
    @Qualifier("requestScheduler")
    private Scheduler requestScheduler;

    @RequestMapping(value = "/test")
    public Mono<ResponseEntity<String>> process(@RequestBody String reqMsg, @RequestHeader HttpHeaders reqHttpHeaders,
        ServerHttpRequest serverHttpRequest) {
        return Mono.just(reqMsg).subscribeOn(requestScheduler).onErrorResume(e -> {
            return Mono.just(e.getMessage());
        }).flatMap(responseMsg -> {
            return Mono.just(new ResponseEntity<>(responseMsg, HttpStatus.OK));
        });
    }
}

Exception stack

2020-06-09T15:57:00.976+0800|ERROR|pool-2-thread-1021|320|io.netty.util.ResourceLeakDetector:LEAK: ByteBuf.release() was not called before it's garbage-collected. See https://netty.io/wiki/reference-counted-objects.html for more information.
Recent access records: 
Created at:
	io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:363)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:187)
	io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:178)
	io.netty.buffer.AbstractByteBufAllocator.buffer(AbstractByteBufAllocator.java:115)
	org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:71)
	org.springframework.core.io.buffer.NettyDataBufferFactory.allocateBuffer(NettyDataBufferFactory.java:39)
	org.springframework.core.codec.CharSequenceEncoder.lambda$encode$1(CharSequenceEncoder.java:85)
	reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)
	reactor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:99)
	reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)
	reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)
	reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1993)
	reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1867)
	reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)
	reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)
	reactor.core.publisher.FluxJust.subscribe(FluxJust.java:70)
	reactor.core.publisher.FluxMapFuseable.subscribe(FluxMapFuseable.java:63)
	reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)
	reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
	reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
	reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
	reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1623)
	reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:144)
	reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:73)
	reactor.core.publisher.FluxSubscribeOnValue$ScheduledScalar.run(FluxSubscribeOnValue.java:178)
	reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:50)
	reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:27)
	java.util.concurrent.FutureTask.run(FutureTask.java:266)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	java.lang.Thread.run(Thread.java:748)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions