You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by "Thomas Heigl (Jira)" <ji...@apache.org> on 2022/01/10 18:29:00 UTC
[jira] [Comment Edited] (WICKET-6944) Memory leak in WicketEndpoint
[ https://issues.apache.org/jira/browse/WICKET-6944?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17472208#comment-17472208 ]
Thomas Heigl edited comment on WICKET-6944 at 1/10/22, 6:28 PM:
----------------------------------------------------------------
[~mgrigorov]: Do you have any idea how to best solve this?
I think we should keep the listener in a field and remove it when the connection is closed.
Or maybe there is an alternative to the listener, to check if the app is still alive.
was (Author: thomas.heigl):
[~mgrigorov]: Do you have any idea how to best solve this?
I think we should keep the listener in a field and remove it when the connection is closed.
> Memory leak in WicketEndpoint
> -----------------------------
>
> Key: WICKET-6944
> URL: https://issues.apache.org/jira/browse/WICKET-6944
> Project: Wicket
> Issue Type: Bug
> Components: wicket-native-websocket
> Affects Versions: 9.7.0
> Reporter: Thomas Heigl
> Assignee: Thomas Heigl
> Priority: Major
> Attachments: image-2022-01-10-18-52-42-193.png
>
>
> Our application OOMed yesterday after about 2-3 weeks of continuous uptime. We normally deploy every other day, so we never noticed this issue before.
> The heap dump identified the possible culprit as {{{}WicketEndpoint$ApplicationListener{}}}:
> !image-2022-01-10-18-52-42-193.png!
> Every new websocket connection registers a new instance of this application listener and after a while we ended up with millions of these listeners:
> {code:java}
> @Override
> public void onOpen(Session session, EndpointConfig endpointConfig)
> {
> String appName = getApplicationName(session);
> WebApplication app = (WebApplication) WebApplication.get(appName);
> app.getApplicationListeners().add(new ApplicationListener(applicationDestroyed));
> try
> {
> ThreadContext.setApplication(app);
> javaxWebSocketProcessor = new JavaxWebSocketProcessor(session, app, endpointConfig);
> }
> finally
> {
> ThreadContext.detach();
> }
> }
> {code}
> Instead of creating a new listener for every connection, the listener should be a singleton.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)