java.lang.OutOfMemoryError happens with high concurrency
- Dominant language
- Java
- Stars
- 2.7k
- Forks
- 620
- Avg merge
- 3d 23h
- Merged PRs (30d)
- 11
Description
We use this sshj library with version 0.19.0 in our android app, we used the remote portforwarding function of this library, sometimes app will crash by exception "java.lang.OutOfMemoryError", we checked the log, found nearly 900 threads named with "chanopener" were created, here is part of the logs:
```
#0. Crashed: reader: 0 0 0x0000000000000000
at java.lang.Thread.nativeCreate(Thread.java)
at java.lang.Thread.start(Thread.java:730)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener.callListener(AbstractForwardedChannelOpener.java:72)
at net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder.handleOpen(RemotePortForwarder.java:258)
at net.schmizz.sshj.connection.ConnectionImpl.gotChannelOpen(ConnectionImpl.java:231)
at net.schmizz.sshj.connection.ConnectionImpl.handle(ConnectionImpl.java:141)
at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490)
at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:104)
at net.schmizz.sshj.transport.Decoder.received(Decoder.java:172)
at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
--
Fatal Exception: java.lang.OutOfMemoryError: Could not allocate JNI Env
at java.lang.Thread.nativeCreate(Thread.java)
at java.lang.Thread.start(Thread.java:730)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener.callListener(AbstractForwardedChannelOpener.java:72)
at net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder.handleOpen(RemotePortForwarder.java:258)
at net.schmizz.sshj.connection.ConnectionImpl.gotChannelOpen(ConnectionImpl.java:231)
at net.schmizz.sshj.connection.ConnectionImpl.handle(ConnectionImpl.java:141)
at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490)
at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:104)
at net.schmizz.sshj.transport.Decoder.received(Decoder.java:172)
at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
#0. Crashed: reader: 0 0 0x0000000000000000
at java.lang.Thread.nativeCreate(Thread.java)
at java.lang.Thread.start(Thread.java:730)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener.callListener(AbstractForwardedChannelOpener.java:72)
at net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder.handleOpen(RemotePortForwarder.java:258)
at net.schmizz.sshj.connection.ConnectionImpl.gotChannelOpen(ConnectionImpl.java:231)
at net.schmizz.sshj.connection.ConnectionImpl.handle(ConnectionImpl.java:141)
at net.schmizz.sshj.transport.TransportImpl.handle(TransportImpl.java:490)
at net.schmizz.sshj.transport.Decoder.decode(Decoder.java:104)
at net.schmizz.sshj.transport.Decoder.received(Decoder.java:172)
at net.schmizz.sshj.transport.Reader.run(Reader.java:60)
#1. chanopener
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:194)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at java.net.Socket.connect(Socket.java:535)
at net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener.gotConnect(SocketForwardingConnectListener.java:49)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener$1.run(AbstractForwardedChannelOpener.java:58)
#2. chanopener
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:194)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at java.net.Socket.connect(Socket.java:535)
at net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener.gotConnect(SocketForwardingConnectListener.java:49)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener$1.run(AbstractForwardedChannelOpener.java:58)
#3. chanopener
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:194)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at java.net.Socket.connect(Socket.java:535)
at net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener.gotConnect(SocketForwardingConnectListener.java:49)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener$1.run(AbstractForwardedChannelOpener.java:58)
#4. chanopener
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:334)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:194)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:178)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:356)
at java.net.Socket.connect(Socket.java:586)
at java.net.Socket.connect(Socket.java:535)
at net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener.gotConnect(SocketForwardingConnectListener.java:49)
at net.schmizz.sshj.connection.channel.forwarded.AbstractForwardedChannelOpener$1.run(AbstractForwardedChannelOpener.java:58)
```
in above logs, we can found there are 4 threads named with "chanopener" were created, in the rest of logs there are nearly 900 threads "chanopener" were created
in AbstractForwardedChannelOpener.java, shall we use fixed length thread pool instead of create thread each time when ssh channel got open ?
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.