Sun 的 Java SSL 实现正在泄漏内存?
我有一个服务器组件,我正在尝试进行负载测试。与服务器的所有连接都使用 TLS 1.0。我有一个简单的测试程序,基本上可以在我想要的任意数量的线程上执行此操作:
Full TLS handshake to the server
send a request
read reply
close connection
repeat ad nauseam
我的虚拟机如下所示:
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)
我有一个内存泄漏。当我对服务器进行大量测试时,我的内存占用量每秒增加约1兆克,这使得它在15-20分钟后被阻止。OutOfMemoryException
我在 Netbean 的分析器中运行了它,它表明内存的增加是在 TLS API 的深处。
有没有人经历过类似的事情?是否有任何解决方法可以在我的级别实施?
编辑。根据要求,下面是性能分析调用跟踪,它生成了很多这样的字节[]:
.java.io.ByteArrayOutputStream.<init>(int)
..com.sun.net.ssl.internal.ssl.OutputRecord.<init>(byte, int)
...com.sun.net.ssl.internal.ssl.OutputRecord.<init>(byte)
....com.sun.net.ssl.internal.ssl.AppOutputStream.<init>(com.sun.net.ssl.internal.ssl.SSLSocketImpl)
.....com.sun.net.ssl.internal.ssl.SSLSocketImpl.init(com.sun.net.ssl.internal.ssl.SSLContextImpl, boolean)
......com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(com.sun.net.ssl.internal.ssl.SSLContextImpl, java.net.Socket, String, int, boolean)
.......com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(java.net.Socket, String, int, boolean)
<my code>
我还可以放更多...这将是很长的。我会告诉你探查器给我的入口点:
....com.sun.net.ssl.internal.ssl.AppOutputStream.<init>(com.sun.net.ssl.internal.ssl.SSLSocketImpl)
....com.sun.net.ssl.internal.ssl.HandshakeOutStream.<init>(com.sun.net.ssl.internal.ssl.ProtocolVersion, com.sun.net.ssl.internal.ssl.ProtocolVersion, com.sun.net.ssl.internal.ssl.HandshakeHash, com.sun.net.ssl.internal.ssl.SSLSocketImpl)
....com.sun.net.ssl.internal.ssl.SSLSocketImpl.sendAlert(byte, byte)
..com.sun.net.ssl.internal.ssl.AppInputStream.<init>(com.sun.net.ssl.internal.ssl.SSLSocketImpl)
..com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake()
..com.sun.net.ssl.internal.ssl.HandshakeInStream.<init>(com.sun.net.ssl.internal.ssl.HandshakeHash)