Sun's Java SSL Implementation is Leaking Memory?

java, memory-leaks, ssl

Solution

Have u seen the connection close. Most likely this is still open somehow. 1Mb is a sing of some extra thread. However, I am not sure what exactly would be the reason.

Problem

I have a server component that I'm trying to load-test. All connections to the server use TLS 1.0. I have a simple test program that essentially does this on as many threads as I want: ``` Full TLS handshake to the server send a request read reply close connection repeat ad nauseam ``` My virtual machine is as follows: ``` Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode) ``` I have a memory leak. My memory footprint increases by about 1 meg per second when I heavily test my server, which makes it block after 15-20 minutes with `OutOfMemoryException`. I ran it in Netbean's profiler and it showed that the increase of memory was deep within the TLS API. Has anyone ever experienced something similar? Is there any workaround I can implement at my level? Edit. As requested, here's the profiling call trace which generates a lot of these byte[]: ``` .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> ``` There are many more I can put... this would be long. I'll tell you the entry points that the profiler gives me: ``` ....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) ```

Original source