【发布时间】:2009-10-26 08:34:50
【问题描述】:
我有一个服务器组件,我正在尝试进行负载测试。与服务器的所有连接都使用 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 兆,这使它在使用 OutOfMemoryException 15-20 分钟后阻塞。
我在 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)
【问题讨论】:
-
你能提供一些更具体的分析结果吗?泄漏不一定来自 TLS,它可能在您的代码中。
-
请创建表现出这种行为的最小可能程序并将其添加到您的问题中。
标签: java memory-leaks ssl