Tengo un componente de servidor que estoy tratando de cargar-prueba. Todas las conexiones al servidor usan TLS 1.0. Tengo un programa simple prueba que esencialmente hace esto en tantos hilos como yo quiero:La implementación de Java SSL de Sun está perdiendo memoria?
Full TLS handshake to the server
send a request
read reply
close connection
repeat ad nauseam
Mi máquina virtual es el siguiente:
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)
que tienen una pérdida de memoria. La huella de mi memoria aumenta en aproximadamente 1 meg por segundo cuando pongo a prueba mi servidor, lo que hace que bloquee después de 15-20 minutos con OutOfMemoryException
.
Lo ejecuté en el generador de perfiles de Netbean y mostró que el aumento de la memoria era profundo dentro de la API de TLS.
¿Alguien ha experimentado algo similar? ¿Hay alguna solución alternativa que pueda implementar en mi nivel?
Editar. Conforme a lo solicitado, aquí está el rastreo de llamadas perfilado que genera una gran cantidad de estos 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>
hay muchos más que puedo poner ... esto sería larga. Te voy a decir los puntos de entrada que el perfilador me da:
....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)
¿Puede proporcionar algunos resultados de perfiles más específicos? La fuga no es necesariamente de TLS, podría estar en tu código. –
Cree el programa más pequeño posible que muestre este comportamiento y agréguelo a su pregunta. –