Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Netty resource leak #3568

Open
jerseyrobot opened this issue May 31, 2017 · 6 comments
Open

Netty resource leak #3568

jerseyrobot opened this issue May 31, 2017 · 6 comments

Comments

@jerseyrobot
Copy link
Contributor

When I run Jersey using the Netty http2 container and a custom MessageBodyReader/Writer I get Netty resource leaks. (I did not test to see if the resource leaks happen even in the absence of the custom reader/writer; my app requires them.)

I register the custom handler with a ResourceConfig and create the server like this:
Channel channel = NettyHttpContainerProvider.createHttp2Server(
URI.create("http://" + host + ":" + port + "/"), conf, null);

Within the handler all I'm doing is reading from the InputStream entityStream.

In the test app I set:

ResourceLeakDetector.setLevel(Level.ADVANCED);

io.netty.util.ResourceLeakDetector 11732 ERROR LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
WARNING: 17 leak records were discarded because the leak record count is limited to 4. Use system property io.netty.leakDetection.maxRecords to increase the limit.
Recent access records: 5
#5:
io.netty.buffer.AdvancedLeakAwareByteBuf.readBytes(AdvancedLeakAwareByteBuf.java:501)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:120)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:110)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:102)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:296)
com.dieselpoint.buffers.ByteUtil.readBuffer(ByteUtil.java:175)
com.dieselpoint.cluster.common.Command.readFrom(Command.java:65)
com.dieselpoint.raft.RaftSerializer.readFrom(RaftSerializer.java:68)
com.dieselpoint.transport.jaxrs.MessageBodyHandler.readFrom(MessageBodyHandler.java:56)
com.dieselpoint.transport.jaxrs.MessageBodyHandler.readFrom(MessageBodyHandler.java:1)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:271)
org.glassfish.jersey.server.internal.inject.EntityParamValueFactoryProvider$EntityValueFactory.provide(EntityParamValueFactoryProvider.java:96)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:94)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:143)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
org.glassfish.jersey.server.model.ResourceMethodInvoker.access$100(ResourceMethodInvoker.java:102)
org.glassfish.jersey.server.model.ResourceMethodInvoker$2.call(ResourceMethodInvoker.java:336)
org.glassfish.jersey.server.model.ResourceMethodInvoker$2.call(ResourceMethodInvoker.java:333)
org.glassfish.jersey.server.ServerRuntime$AsyncResponder$2$1.run(ServerRuntime.java:893)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
org.glassfish.jersey.server.ServerRuntime$AsyncResponder$2.run(ServerRuntime.java:888)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
#4:
io.netty.buffer.AdvancedLeakAwareByteBuf.readByte(AdvancedLeakAwareByteBuf.java:399)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:109)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:136)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:92)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:286)
... more of same ...

@jerseyrobot
Copy link
Contributor Author

@cclient Commented
same problem http1.1

develop base on https://github.com/jersey/jersey/tree/master/examples/helloworld-netty

2017-05-26 14:23:08 ERROR ResourceLeakDetector:285 - LEAK: ByteBuf.release() was not called before it's garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.
WARNING: 11 leak records were discarded because the leak record count is limited to 4. Use system property io.netty.leakDetection.maxRecords to increase the limit.
Recent access records: 5
#5:
io.netty.buffer.AdvancedLeakAwareByteBuf.readBytes(AdvancedLeakAwareByteBuf.java:501)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:120)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:110)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:102)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:297)
org.glassfish.json.UnicodeDetectingInputStream.read(UnicodeDetectingInputStream.java:186)
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
java.io.InputStreamReader.read(InputStreamReader.java:184)
org.glassfish.json.JsonTokenizer.fillBuf(JsonTokenizer.java:473)
org.glassfish.json.JsonTokenizer.read(JsonTokenizer.java:434)
org.glassfish.json.JsonTokenizer.nextToken(JsonTokenizer.java:354)
org.glassfish.json.JsonParserImpl$NoneContext.getNextEvent(JsonParserImpl.java:222)
org.glassfish.json.JsonParserImpl$StateIterator.next(JsonParserImpl.java:172)
org.glassfish.json.JsonParserImpl.next(JsonParserImpl.java:149)
org.glassfish.json.JsonReaderImpl.read(JsonReaderImpl.java:84)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:97)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:68)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1081)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:274)
org.glassfish.jersey.server.internal.inject.EntityParamValueSupplierProvider$EntityValueSupplier.get(EntityParamValueSupplierProvider.java:104)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.get(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:91)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:131)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:237)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:451)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:412)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:281)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:862)
org.glassfish.jersey.netty.httpserver.JerseyServerHandler$1.run(JerseyServerHandler.java:115)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
#4:
io.netty.buffer.AdvancedLeakAwareByteBuf.readByte(AdvancedLeakAwareByteBuf.java:399)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:109)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:136)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:92)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:287)
org.glassfish.json.UnicodeDetectingInputStream.fillBuf(UnicodeDetectingInputStream.java:110)
org.glassfish.json.UnicodeDetectingInputStream.detectEncoding(UnicodeDetectingInputStream.java:129)
org.glassfish.json.UnicodeDetectingInputStream.(UnicodeDetectingInputStream.java:76)
org.glassfish.json.JsonParserImpl.(JsonParserImpl.java:76)
org.glassfish.json.JsonReaderImpl.(JsonReaderImpl.java:68)
org.glassfish.json.JsonReaderFactoryImpl.createReader(JsonReaderFactoryImpl.java:71)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:95)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:68)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1081)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:274)
org.glassfish.jersey.server.internal.inject.EntityParamValueSupplierProvider$EntityValueSupplier.get(EntityParamValueSupplierProvider.java:104)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.get(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:91)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:131)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:237)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:451)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:412)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:281)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:862)
org.glassfish.jersey.netty.httpserver.JerseyServerHandler$1.run(JerseyServerHandler.java:115)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
#3:
io.netty.buffer.AdvancedLeakAwareByteBuf.readByte(AdvancedLeakAwareByteBuf.java:399)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:109)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:136)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:92)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:287)
org.glassfish.json.UnicodeDetectingInputStream.fillBuf(UnicodeDetectingInputStream.java:102)
org.glassfish.json.UnicodeDetectingInputStream.detectEncoding(UnicodeDetectingInputStream.java:129)
org.glassfish.json.UnicodeDetectingInputStream.(UnicodeDetectingInputStream.java:76)
org.glassfish.json.JsonParserImpl.(JsonParserImpl.java:76)
org.glassfish.json.JsonReaderImpl.(JsonReaderImpl.java:68)
org.glassfish.json.JsonReaderFactoryImpl.createReader(JsonReaderFactoryImpl.java:71)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:95)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:68)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1081)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:274)
org.glassfish.jersey.server.internal.inject.EntityParamValueSupplierProvider$EntityValueSupplier.get(EntityParamValueSupplierProvider.java:104)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.get(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:91)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:131)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:237)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:451)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:412)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:281)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:862)
org.glassfish.jersey.netty.httpserver.JerseyServerHandler$1.run(JerseyServerHandler.java:115)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
#2:
io.netty.buffer.AdvancedLeakAwareByteBuf.readByte(AdvancedLeakAwareByteBuf.java:399)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:109)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:136)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:92)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:287)
org.glassfish.json.UnicodeDetectingInputStream.fillBuf(UnicodeDetectingInputStream.java:95)
org.glassfish.json.UnicodeDetectingInputStream.detectEncoding(UnicodeDetectingInputStream.java:129)
org.glassfish.json.UnicodeDetectingInputStream.(UnicodeDetectingInputStream.java:76)
org.glassfish.json.JsonParserImpl.(JsonParserImpl.java:76)
org.glassfish.json.JsonReaderImpl.(JsonReaderImpl.java:68)
org.glassfish.json.JsonReaderFactoryImpl.createReader(JsonReaderFactoryImpl.java:71)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:95)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:68)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1081)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:274)
org.glassfish.jersey.server.internal.inject.EntityParamValueSupplierProvider$EntityValueSupplier.get(EntityParamValueSupplierProvider.java:104)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.get(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:91)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:131)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:237)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:451)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:412)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:281)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:862)
org.glassfish.jersey.netty.httpserver.JerseyServerHandler$1.run(JerseyServerHandler.java:115)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
#1:
io.netty.buffer.AdvancedLeakAwareByteBuf.readByte(AdvancedLeakAwareByteBuf.java:399)
io.netty.buffer.ByteBufInputStream.read(ByteBufInputStream.java:109)
org.glassfish.jersey.netty.connector.internal.NettyInputStream.read(NettyInputStream.java:136)
org.glassfish.jersey.message.internal.EntityInputStream.read(EntityInputStream.java:92)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream.read(ReaderInterceptorExecutor.java:287)
org.glassfish.json.UnicodeDetectingInputStream.fillBuf(UnicodeDetectingInputStream.java:90)
org.glassfish.json.UnicodeDetectingInputStream.detectEncoding(UnicodeDetectingInputStream.java:129)
org.glassfish.json.UnicodeDetectingInputStream.(UnicodeDetectingInputStream.java:76)
org.glassfish.json.JsonParserImpl.(JsonParserImpl.java:76)
org.glassfish.json.JsonReaderImpl.(JsonReaderImpl.java:68)
org.glassfish.json.JsonReaderFactoryImpl.createReader(JsonReaderFactoryImpl.java:71)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:95)
org.glassfish.json.jaxrs.JsonStructureBodyReader.readFrom(JsonStructureBodyReader.java:68)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1081)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:274)
org.glassfish.jersey.server.internal.inject.EntityParamValueSupplierProvider$EntityValueSupplier.get(EntityParamValueSupplierProvider.java:104)
org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.get(ParamValueFactoryWithSource.java:71)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:91)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:131)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$TypeOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:237)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:451)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:412)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:281)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:862)
org.glassfish.jersey.netty.httpserver.JerseyServerHandler$1.run(JerseyServerHandler.java:115)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
Created at:
io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:271)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179)
io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:170)
io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:131)
io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:73)
io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:117)
io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:610)
io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:551)
io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:465)
io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:437)
io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873)
io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
java.lang.Thread.run(Thread.java:745)

@jerseyrobot
Copy link
Contributor Author

@DavidSonoda
Copy link

Same problem here

@kuzfa
Copy link

kuzfa commented Aug 16, 2018

same problem too

@jansupol
Copy link
Contributor

please refer to Jersey version

@kuzfa
Copy link

kuzfa commented Aug 17, 2018

version:2.27
found class NettyInputStream 's method:
public int read(byte[] b, int off, int len) throws IOException {
if (end) {
return -1;
}
InputStream take;
try {
take = isList.take();

        if (checkEndOfInput(take)) {
            return -1;
        }

        int read = take.read(b, off, len);

        if (take.available() > 0) {
            isList.addFirst(take);
        }

        return read;
    } catch (InterruptedException e) {
        throw new IOException("Interrupted.", e);
    }
}

in my case the var of 'take' is ByteBufInputStream which contain ByteBuf buffer;
i think the leak is happened by the 'take'

so i add fellow code:

finally {
if (null != take) {
try {
Field field = take.getClass().getDeclaredField("buffer");
field.setAccessible(true);
ByteBuf buf =(ByteBuf) field.get(take);
ReferenceCountUtil.release(buf);
} catch (Exception e) {

            }
        }
    }

the leak seems solved

010gvr added a commit to 010gvr/jersey that referenced this issue Nov 6, 2019
This commit contains a rewritten implementation of Netty Jersey server and client with the following major changes:
1) Consume `ByteBuf`s from `HttpContent` as-is for processing.
2) Fixes major leak and timout issues reported in eclipse-ee4j#3500 , eclipse-ee4j#3568 and eclipse-ee4j#4286
3) Fixes a bug on reading 0-byte or 1-byte JSON content

Signed-off-by: Venkat Ganesh [email protected]
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 6, 2019
This commit contains a rewritten implementation of Netty Jersey server and client with the following major changes:
1) Consume `ByteBuf`s from `HttpContent` as-is for processing, reduces a lot of overhead.
2) Fixes a bug on reading 0-byte or 1-byte JSON content
3) Add three new configurable `ChunkedInput` buffer properties through `jersey.ci.capacity`, `jersey.ci.read.timeout` and `jersey.ci.write.timeout`
4) Add configurable payload size through `jersey.max.http.request.entitySizeMb` , defaults to 50 Mb

This change should fix some of the long pending bug reports in eclipse-ee4j#3500 , eclipse-ee4j#3568 and eclipse-ee4j#4286 . This may also resolve eclipse-ee4j#4285

Signed-off-by: Venkat Ganesh [email protected]
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 6, 2019
This commit contains a rewritten implementation of Netty Jersey server and client with the following major changes:
1) Consume `ByteBuf`s from `HttpContent` as-is for processing, reduces a lot of overhead.
2) Fixes a bug on reading 0-byte or 1-byte JSON content
3) Add three new configurable `ChunkedInput` buffer properties through `jersey.ci.capacity`, `jersey.ci.read.timeout` and `jersey.ci.write.timeout`
4) Add configurable payload size through `jersey.max.http.request.entitySizeMb` , defaults to 50 Mb

This change should fix some of the long pending bug reports in eclipse-ee4j#3500 , eclipse-ee4j#3568 and eclipse-ee4j#4286 . This may also resolve eclipse-ee4j#4285

Signed-off-by: Venkat Ganesh [email protected]
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 6, 2019
This commit contains a rewritten implementation of Netty Jersey server and client with the following major changes:
1) Consume `ByteBuf`s from `HttpContent` as-is for processing, reduces a lot of overhead.
2) Fixes a bug on reading 0-byte or 1-byte JSON content
3) Add three new configurable `ChunkedInput` buffer properties through `jersey.ci.capacity`, `jersey.ci.read.timeout` and `jersey.ci.write.timeout`
4) Add configurable payload size through `jersey.max.http.request.entitySizeMb` , defaults to 50 Mb

This change should fix some of the long pending bug reports in eclipse-ee4j#3500 , eclipse-ee4j#3568 and eclipse-ee4j#4286 . This may also resolve eclipse-ee4j#4285

Signed-off-by: Venkat Ganesh [email protected]
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 6, 2019
This commit contains a rewritten implementation of Netty Jersey server and client with the following major changes:
1) Consume `ByteBuf`s from `HttpContent` as-is for processing, reduces a lot of overhead.
2) Fixes a bug on reading 0-byte or 1-byte JSON content
3) Add three new configurable `ChunkedInput` buffer properties through `jersey.ci.capacity`, `jersey.ci.read.timeout` and `jersey.ci.write.timeout`
4) Add configurable payload size through `jersey.max.http.request.entitySizeMb` , defaults to 50 Mb

This change should fix some of the long pending bug reports in eclipse-ee4j#3500 , eclipse-ee4j#3568 and eclipse-ee4j#4286 . This may also resolve eclipse-ee4j#4285

Signed-off-by: Venkat Ganesh [email protected]
010gvr pushed a commit to 010gvr/jersey that referenced this issue Nov 30, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr pushed a commit to 010gvr/jersey that referenced this issue Nov 30, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr pushed a commit to 010gvr/jersey that referenced this issue Nov 30, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 30, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr added a commit to 010gvr/jersey that referenced this issue Nov 30, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr added a commit to 010gvr/jersey that referenced this issue Dec 1, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
010gvr added a commit to 010gvr/jersey that referenced this issue Dec 1, 2019
Current unit tests only validate Netty's `JerseyClientHandler` against a Grizzly http server. This commit adds test cases to validate the same using Netty's `JerseyServerHandler` using `NettyTestContainerFactory`.

Also adding extra test cases to effectively validate the bug fixes for eclipse-ee4j#3500 and eclipse-ee4j#3568 (that is, these new test cases will fail if ran against the code base older than eclipse-ee4j#4312)

Fixes eclipse-ee4j#3500 and eclipse-ee4j#3568

Signed-off-by: Venkat Ganesh <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants