Skip to content

Spring WebFlux "ResourceLeakDetector:LEAK" #25213

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions