Mam składnik serwera, który próbuję załadować test. Wszystkie połączenia z serwerem korzystają z TLS 1.0. Mam prosty program testowy, który w zasadzie robi to na tyle wątków, jak chcę:Wdrożenie Java SSL przez Sun to przeciekająca pamięć?
Full TLS handshake to the server
send a request
read reply
close connection
repeat ad nauseam
Moja maszyna wirtualna jest następujący:
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) Server VM (build 14.2-b01, mixed mode)
Mam wyciek pamięci. Mój ślad pamięci zwiększa się o około 1 megawata na sekundę, kiedy mocno testuję mój serwer, co sprawia, że blokuje się po 15-20 minutach z OutOfMemoryException
.
Uruchomiłem go w narzędziu profilującym Netbean i pokazałem, że zwiększenie pamięci było głęboko w interfejsie API TLS.
Czy ktoś kiedykolwiek doświadczył czegoś podobnego? Czy istnieje jakieś obejście, które mogę wdrożyć na moim poziomie?
Edytuj. Zgodnie z wnioskiem, oto profilowanie ślad wezwanie, które generuje dużo tych 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>
Istnieje wiele więcej mogę umieścić ... to będzie długa. Powiem wam, że punkty wejścia profilera daje mi:
....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)
Czy możesz podać bardziej szczegółowe wyniki profilowania? Wyciek niekoniecznie musi pochodzić z TLS, może być w twoim kodzie. –
Należy utworzyć najmniejszy możliwy program, który wykazuje to zachowanie i dodać go do pytania. –