Closed
Description
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
Labels
No labels