hierynomus / hierynomus/sshj

java.lang.OutOfMemoryError happens with high concurrency

Open
#325 0 comments 0 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.