[
https://issues.apache.org/jira/browse/KYLIN-4131?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16938618#comment-16938618
]
ASF subversion and git services commented on KYLIN-4131:
--------------------------------------------------------
Commit 8bd6bedbc26da9d6acd9bf2232688bfaf8804e92 in kylin's branch
refs/heads/2.6.x from chao long
[ https://gitbox.apache.org/repos/asf?p=kylin.git;h=8bd6bed ]
KYLIN-4131 Fix Broadcaster memory leak
> Broadcaster memory leak
> -----------------------
>
> Key: KYLIN-4131
> URL: https://issues.apache.org/jira/browse/KYLIN-4131
> Project: Kylin
> Issue Type: Bug
> Components: Metadata
> Reporter: Chao Long
> Assignee: Chao Long
> Priority: Critical
> Fix For: v3.0.0, v2.6.4
>
> Attachments: image-2019-08-12-16-39-46-262.png,
> image-2019-08-12-16-39-52-327.png, image-2019-08-12-17-16-05-532.png,
> image-2019-08-12-17-22-15-783.png, image-2019-08-12-17-22-23-477.png
>
>
> h3. *Test evidence*
> Use MAT(Memory Analyzer) to analyze this issue.
> # start Kylin, dump a jvm heap info snapshot and import into MAT. We can
> see there is only one Broadcaster and ProjectManager object.
> !image-2019-08-12-17-22-15-783.png|width=721,height=520!
> # Call 'list cube' api and 'reload metadata' api many times. We can see
> there are many BroadCaster and Manager objects in the memory, which should be
> recycled by GC, but they are not.
> !image-2019-08-12-17-22-23-477.png|width=724,height=498!
>
> *Root cause*
> Broadcaster hold the ref of Listener object defined in Manager, and the
> Listener object hold the ref of Manager, because the impl class of Listener
> is an inner class of Manager.
> Broadcaster.java
> {code:java}
> private Map<String, List<Listener>> listenerMap = Maps.newConcurrentMap();
> {code}
> ProjectManager.java -> ProjectSyncListener
> {code:java}
> private class ProjectSyncListener extends Broadcaster.Listener {
> @Override
> public void onEntityChange(Broadcaster broadcaster, String entity, Event
> event, String cacheKey)
> throws IOException {
> String project = cacheKey;
> if (event == Event.DROP) {
> removeProjectLocal(project);
> return;
> }
> reloadProjectQuietly(project);
> broadcaster.notifyProjectSchemaUpdate(project);
> broadcaster.notifyProjectDataUpdate(project);
> }
> }
> {code}
> And Broadcaster can't be recycled by GC because it holds a running thread,
> which cause the Manager object also not being recycled.
> *After Fix*
> The Broadcaster objects and Manager objects are recycled by GC.
> !image-2019-08-12-17-16-05-532.png!
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)