[ https://issues.apache.org/jira/browse/WICKET-6793?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17125704#comment-17125704 ]
Martin Tzvetanov Grigorov commented on WICKET-6793: --------------------------------------------------- Actually it looks like two separate problems. > OOM in AsynchronousPageStore > ---------------------------- > > Key: WICKET-6793 > URL: https://issues.apache.org/jira/browse/WICKET-6793 > Project: Wicket > Issue Type: Bug > Components: wicket-core > Affects Versions: 8.7.0 > Reporter: Vladimir Kubinda > Assignee: Sven Meier > Priority: Major > Fix For: 9.0.0-M6, 8.9.0 > > > After migrating to version 8.X, we face an out-of-memory issue. To clear the > locked memory, the server must be restarted several times a week. > After analyzing the heap dumps, we found that the vast majority of the heap > is AsynchronousPageStore.entryMap. We started looking for some solutions and > found a WICKET-6629 error. I think this fix is not enough and should > include removing AsynchronousPageStore.Entry also from > AsynchronousPageStore.entryMap not only from AsynchronousPageStore.entries. > Let me explain what I think. If StoreSettings.isAsynchronous is set to true > (default option), Wicket uses AsynchronousPageStore to store the pages. > AsynchronousPageStore.storePage method inserts the entry to entryMap on line > 278 (version 8.7.0). If the entries are not full, entry is inserts to entries > queue on line 282. > Then wait until the PageSavingRunnable poll entry from queue, store it and > remove it from entryMap on line 209. Now everything is fine. > But what if the entry's session is unbind (expires, logout etc.), and entry > was already inserted into entries and entryMap? Therefore, there is an > AsynchronousPageStore.unbind method that removes all entries for the session > from entries queue. But entry that has not yet been saved (in > PageSavingRunnable, because it was waiting in queue) still exists and will > not be removed from entryMap. > When the entry is inserted into the AsynchronousPageStore.entryMap and > AsynchronousPageStore.entries queue, there is only one place where the entry > can be deleted from the AsynchronousPageStore.entryMap, and that is on line > 209 in PageSavingRunnable.run method. But when we deleted an entry from the > AsynchronousPageStore.entries, the entry in the > AsynchronousPageStore.entryMap remains there, because if statment on line 205 > in PageSavingRunnable.run. > So now if you have thousands of users and the sites are huge, it's only a > matter of time before it starts to cause a problem. > I think solution is remove all entries from unbinded session from > AsynchronousPageStore.entryMap. > I hope that I'm right. -- This message was sent by Atlassian Jira (v8.3.4#803005)