tomee-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Tony Weston (JIRA)" <j...@apache.org>
Subject [jira] [Created] (TOMEE-1649) Websockets Memory Leak
Date Mon, 02 Nov 2015 14:06:27 GMT
Tony Weston created TOMEE-1649:
----------------------------------

             Summary: Websockets Memory Leak
                 Key: TOMEE-1649
                 URL: https://issues.apache.org/jira/browse/TOMEE-1649
             Project: TomEE
          Issue Type: Bug
          Components: TomEE Core Server
    Affects Versions: 1.7.2, 1.7.3
            Reporter: Tony Weston
            Priority: Blocker


Websocket sessions are not GC'd on close.  This will quickly lead to out-of-memory condition,
and server hang.  I have marked this is a blocker as any application that uses Websockets
will have this issue; it is not a corner case. 

To reproduce, create a Websocket handler, and index.html to create the socket. See below.
  Load index.html in a browser, and refresh the page several times.

Using VisualVM (or other memory profiler), search for websocket in the heap dump.    You should
find that every refresh of the page will cause an additional instance of WsSession, and other
supporting classes.

These instances are referenced by org.apache.openejb.core.WebContext /  creationalContexts,
and do not appear to be removed when the websocket is closed.


{code:title=MyWebsocket.java}
import javax.enterprise.context.ApplicationScoped;
import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint(value = "/ws")
public class MyWebsocket {

	@OnOpen
	public void wsOpen(Session session){
		System.out.println("WS Opened");
	}
	
	@OnClose
	public void wsClosed(Session session){
		System.out.println("WS Closed");
	}
}
{code}

Amend the ws://localhost:8080/WebsockMemleak/ws  url in the source below, to match your context
root / port number.

{code:title=index.html}
<html>
<script>
var ws = new WebSocket("ws://localhost:8080/WebsockMemleak/ws");


window.onbeforeunload = function(){
	ws.close();
}

</script>
</html>
{code}




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message