ngrok-java icon indicating copy to clipboard operation
ngrok-java copied to clipboard

有内存泄漏问题

Open 0312birdzhang opened this issue 7 years ago • 34 comments

如图,在频繁的请求下内存会慢慢增长,在一段时间后会暴涨 image

0312birdzhang avatar Aug 13 '18 10:08 0312birdzhang

这是个问题,这个版本本来就很烂。,,,,有很多bug的。。有空我我考虑重写吧

dosgo avatar Aug 13 '18 10:08 dosgo

我在你的基础上改了一点,发现还是有问题,所以才提issue了 😂 期待ing ...

0312birdzhang avatar Aug 13 '18 10:08 0312birdzhang

把你代码合并呗,一起开发呗?我一个人近期提不起兴趣来

dosgo avatar Aug 13 '18 10:08 dosgo

我改的代码现在跟你的几乎没多少区别,也没解决实质性的问题。 等我看看原理再改一下,然后给你提pr吧

0312birdzhang avatar Aug 13 '18 10:08 0312birdzhang

好啊,其实我的想法是用nio重写。。但是nio对ssl加密。官方没有实现。。要自己弄。。nio不需要这么多线程

dosgo avatar Aug 13 '18 10:08 dosgo

只要是用线程的内存泄漏不好处理。。。功力不够。。nio就好很多了,

dosgo avatar Aug 13 '18 10:08 dosgo

+QQ一起开发呗,,,没几行代码,我先研究下nio ssl,搭个雏形

dosgo avatar Aug 13 '18 10:08 dosgo

😂我都没有看过这些底层的东西,太菜了

0312birdzhang avatar Aug 13 '18 10:08 0312birdzhang

好了,你看看。。测试下,。。

dosgo avatar Aug 15 '18 04:08 dosgo

6666, 好的

0312birdzhang avatar Aug 15 '18 05:08 0312birdzhang

用浏览器访问会卡住,控制台报错如下:

recvstr:{"Type":"AuthResp","Payload":{"Version":"2","MmVersion":"1.7","ClientId":"60c0b7da5bcc5e2f9866aec2c281e3a1","Error":""}}
AuthResp .....OK....
recvstr:{"Type":"ReqProxy","Payload":{}}
recvstr:{"Type":"NewTunnel","Payload":{"ReqId":"84333d24","Url":"http://4c93e15b.tunnel.qydev.com","Protocol":"http","Error":""}}
NewTunnel .....OK....
recvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"ReqProxy","Payload":{}}
recvstr:{"Type":"StartProxy","Payload":{"Url":"http://4c93e15b.tunnel.qydev.com","ClientAddr":"14.23.164.60:49463"}}
recvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"StartProxy","Payload":{"Url":"http://4c93e15b.tunnel.qydev.com","ClientAddr":"14.23.164.60:45442"}}
recvstr:{"Type":"ReqProxy","Payload":{}}
Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: java.nio.channels.ClosedChannelException
	at com.geek.ngrok.NioSSLProvider.onOutput(NioSSLProvider.java:35)
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:172)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:92)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:66)
	at com.geek.ngrok.SSLProvider$1.run(SSLProvider.java:45)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.nio.channels.ClosedChannelException
	at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:265)
	at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:474)
	at com.geek.ngrok.NioSSLProvider.onOutput(NioSSLProvider.java:31)
	... 7 more
java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:182)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:99)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:66)
	at com.geek.ngrok.NioSSLProvider.initEngine(NioSSLProvider.java:92)
	at com.geek.ngrok.NgrokClient.start(NgrokClient.java:146)
	at com.geek.ngrok.ngrok.main(ngrok.java:17)
recvstr:{"Type":"ReqProxy","Payload":{}}
java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:182)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:99)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:66)
	at com.geek.ngrok.NioSSLProvider.initEngine(NioSSLProvider.java:92)
	at com.geek.ngrok.NgrokClient.start(NgrokClient.java:146)
	at com.geek.ngrok.ngrok.main(ngrok.java:17)
Exception in thread "pool-1-thread-2" java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:182)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:92)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:66)
	at com.geek.ngrok.SSLProvider$1.run(SSLProvider.java:45)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)

0312birdzhang avatar Aug 15 '18 05:08 0312birdzhang

链接复用会出错,原因不明

dosgo avatar Aug 15 '18 09:08 dosgo

对,我明明在自己电脑上是这个链接,断开之后打包放到服务器上跑还是那个链接,看的我一脸懵逼

0312birdzhang avatar Aug 15 '18 10:08 0312birdzhang

好了,已修复。

dosgo avatar Aug 16 '18 09:08 dosgo

nio使用姿势不对导致的。。

dosgo avatar Aug 16 '18 09:08 dosgo

Hmmmmmm,我这还是报错 😂

ngrok-java v1.1(2018/8/16)

recvstr:{"Type":"AuthResp","Payload":{"Version":"2","MmVersion":"1.7","ClientId":"a4767422b3afaa817e6c6543fbff791d","Error":""}}
AuthResp .....OK....
recvstr:{"Type":"ReqProxy","Payload":{}}
recvstr:{"Type":"NewTunnel","Payload":{"ReqId":"67119227","Url":"http://72199f94.tunnel.qydev.com","Protocol":"http","Error":""}}
NewTunnel .....OK....
recvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"StartProxy","Payload":{"Url":"http://72199f94.tunnel.qydev.com","ClientAddr":"14.23.164.60:51554"}}
recvstr:{"Type":"ReqProxy","Payload":{}}
Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: java.nio.channels.ClosedChannelException
	at com.geek.ngrok.NioSSLProvider.onOutput(NioSSLProvider.java:34)
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:174)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:94)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:68)
	at com.geek.ngrok.SSLProvider$1.run(SSLProvider.java:47)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.nio.channels.ClosedChannelException
	at sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:270)
	at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:461)
	at com.geek.ngrok.NioSSLProvider.onOutput(NioSSLProvider.java:30)
	... 7 more
java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:184)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:101)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:68)
	at com.geek.ngrok.NioSSLProvider.initEngine(NioSSLProvider.java:91)
	at com.geek.ngrok.NgrokClient.start(NgrokClient.java:192)
	at com.geek.ngrok.ngrok.main(ngrok.java:15)
recvstr:{"Type":"ReqProxy","Payload":{}}
java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:184)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:101)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:68)
	at com.geek.ngrok.NioSSLProvider.initEngine(NioSSLProvider.java:91)
	at com.geek.ngrok.NgrokClient.start(NgrokClient.java:192)
	at com.geek.ngrok.ngrok.main(ngrok.java:15)
Exception in thread "pool-1-thread-2" java.lang.IllegalStateException: failed to wrap
	at com.geek.ngrok.SSLProvider.wrap(SSLProvider.java:184)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:94)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:68)
	at com.geek.ngrok.SSLProvider$1.run(SSLProvider.java:47)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)

0312birdzhang avatar Aug 16 '18 09:08 0312birdzhang

断线重连也好了。。不开发了,,测试好了。。给个报告

dosgo avatar Aug 20 '18 07:08 dosgo

这个新版的我就没有正常运行起来过。。。 需要有第三人来跑一下试试,是不是我环境有问题还是代码的问题。

0312birdzhang avatar Aug 20 '18 08:08 0312birdzhang

不至于啊,现在报什么错?

dosgo avatar Aug 20 '18 08:08 dosgo

ngrok-java v1.4(2018/8/20)
recvstr:{"Type":"AuthResp","Payload":{"Version":"2","MmVersion":"1.7","ClientId":"51ac4c443f5edc7b8378bef25e2bbdf2","Error":""}}
AuthResp .....OK....
recvstr:{"Type":"ReqProxy","Payload":{}}
recvstr:{"Type":"NewTunnel","Payload":{"ReqId":"8d03cd41","Url":"http://72199f94.tunnel.qydev.com","Protocol":"http","Error":""}}
NewTunnel .....OK....
recvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"ReqProxy","Payload":{}}
recvstr:{"Type":"StartProxy","Payload":{"Url":"http://72199f94.tunnel.qydev.com","ClientAddr":"14.23.164.60:61520"}}
handshake failure
Exception in thread "pool-1-thread-1" java.nio.BufferOverflowException
	at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:206)
	at com.geek.ngrok.SSLProvider$2.run(SSLProvider.java:75)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
handshake failure
ssl session closed
Exception in thread "pool-1-thread-2" java.nio.BufferOverflowException
	at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:206)
	at com.geek.ngrok.SSLProvider$2.run(SSLProvider.java:75)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
ssl session closed
ssl session closed

image

web服务是有请求的

127.0.0.1 - - [20/Aug/2018 16:56:35] "GET / HTTP/1.1" 200 -

0312birdzhang avatar Aug 20 '18 08:08 0312birdzhang

image 你把这个改成128试下

dosgo avatar Aug 20 '18 09:08 dosgo

改成128在我电脑上还是不行,打包成jar在linux下跑,第一次用浏览器打开可以显示,后面就卡住了

0312birdzhang avatar Aug 20 '18 09:08 0312birdzhang

linux报什么错?

dosgo avatar Aug 20 '18 09:08 dosgo

一样的错误。我在打印 https://github.com/dosgo/ngrok-java/blob/e2adfc047f6b0342133df7621010937313558955/src/com/geek/ngrok/NgrokClient.java#L76 下面把异常打印了一下,是这样的

...
ecvstr:{"Type":"Pong","Payload":{}}
recvstr:{"Type":"StartProxy","Payload":{"Url":"http://72199f94.tunnel.qydev.com","ClientAddr":"14.23.164.60:63874"}}
recvstr:{"Type":"ReqProxy","Payload":{}}
handshake failure
javax.net.ssl.SSLException: Received fatal alert: unexpected_message
	at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
	at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1666)
	at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1634)
	at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1800)
	at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1083)
	at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
	at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
	at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
	at com.geek.ngrok.SSLProvider.unwrap(SSLProvider.java:206)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:117)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:84)
	at com.geek.ngrok.SSLProvider$2.run(SSLProvider.java:76)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
handshake failure
java.lang.IllegalArgumentException: Bad arguments
ssl session closed
	at javax.crypto.Mac.update(Mac.java:509)
	at sun.security.ssl.MAC.compute(MAC.java:135)
	at sun.security.ssl.InputRecord.checkMacTags(InputRecord.java:265)
	at sun.security.ssl.InputRecord.decrypt(InputRecord.java:216)
	at sun.security.ssl.EngineInputRecord.decrypt(EngineInputRecord.java:177)
	at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:974)
	at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:907)
	at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
	at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
	at com.geek.ngrok.SSLProvider.unwrap(SSLProvider.java:206)
	at com.geek.ngrok.SSLProvider.isHandShaking(SSLProvider.java:107)
	at com.geek.ngrok.SSLProvider.exec(SSLProvider.java:84)
	at com.geek.ngrok.SSLProvider$1.run(SSLProvider.java:63)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Exception in thread "pool-1-thread-1" java.nio.BufferOverflowException
	at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:206)
	at com.geek.ngrok.SSLProvider$2.run(SSLProvider.java:75)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
ssl session closed
ssl session closed
ssl session closed
ssl session closed

0312birdzhang avatar Aug 20 '18 09:08 0312birdzhang

你的是jre1.7吗?

dosgo avatar Aug 20 '18 10:08 dosgo

不对1.8

dosgo avatar Aug 20 '18 10:08 dosgo

jre 1.8

0312birdzhang avatar Aug 21 '18 01:08 0312birdzhang

你确认你没改过任何代码?

dosgo avatar Aug 21 '18 03:08 dosgo

没有,我下载的zip包然后把几个.java文件替换了,eclipse里面clean了几次,然后改了一下ngrok.java的subdomain及hostname,如下:

	public static void main(String args[])  throws Exception{ 
		//new
		NgrokClient ngclient=new NgrokClient();
		String subDomain = "72199f94";
		String hostName = "72199f94.tunnel.qydev.com";
		//addtunnel
		ngclient.addTun("127.0.0.1",8080,"http",hostName,subDomain,0,"");
		//start
		ngclient.start();
	}

0312birdzhang avatar Aug 21 '18 03:08 0312birdzhang

。。你直接用eclipse打开我的项目。。别的不动,然后看下

dosgo avatar Aug 21 '18 04:08 dosgo

一样的

0312birdzhang avatar Aug 21 '18 04:08 0312birdzhang

你再看下,如果不是高并发应该不会出问题,高并发会异常断开重连。。原因不明

dosgo avatar Aug 21 '18 08:08 dosgo

现在应该OK了。。。

dosgo avatar Aug 21 '18 08:08 dosgo

大神,报了一个错误 2018-11-08 13:28:13.671 16429-16509/handreace.server W/System.err: javax.net.ssl.SSLException: java.io.EOFException: Read error 2018-11-08 13:28:13.672 16429-16509/handreace.server W/System.err: at com.android.org.conscrypt.SSLUtils.toSSLException(SSLUtils.java:295) 2018-11-08 13:28:13.673 16429-16509/handreace.server W/System.err: at com.android.org.conscrypt.ConscryptEngine.convertException(ConscryptEngine.java:1093) 2018-11-08 13:28:13.673 16429-16509/handreace.server W/System.err: at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:851) 2018-11-08 13:28:13.674 16429-16509/handreace.server W/System.err: at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:678) 2018-11-08 13:28:13.674 16429-16509/handreace.server W/System.err: at com.android.org.conscrypt.ConscryptEngine.unwrap(ConscryptEngine.java:644) 2018-11-08 13:28:13.675 16429-16509/handreace.server W/System.err: at handreace.server.ngrok.SSLProvider.unwrap(SSLProvider.java:205) 2018-11-08 13:28:13.675 16429-16509/handreace.server W/System.err: at handreace.server.ngrok.SSLProvider.isHandShaking(SSLProvider.java:104) 2018-11-08 13:28:13.675 16429-16509/handreace.server W/System.err: at handreace.server.ngrok.SSLProvider.exec(SSLProvider.java:81) 2018-11-08 13:28:13.676 16429-16509/handreace.server W/System.err: at handreace.server.ngrok.SSLProvider$2.run(SSLProvider.java:73) 2018-11-08 13:28:13.676 16429-16509/handreace.server W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 2018-11-08 13:28:13.677 16429-16509/handreace.server W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 2018-11-08 13:28:13.677 16429-16509/handreace.server W/System.err: at java.lang.Thread.run(Thread.java:784)

xiaoshizuzhang avatar Nov 08 '18 05:11 xiaoshizuzhang