Dispose ClientChangesImpl ChangeSets to minimize memory footprint 74/1474/7
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Fri, 16 Feb 2018 13:09:29 +0000 (15:09 +0200)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Tue, 20 Feb 2018 14:01:50 +0000 (16:01 +0200)
commit09366c7018d046746832e4e7033ca2588455dac2
treee55d60d379aa8ab5cada79da7651351bac433f8c
parent7fa60c7f3e3a98026b4657afec5f6c02ed958657
Dispose ClientChangesImpl ChangeSets to minimize memory footprint

This change stems from the fact that
org.simantics.db.common.changeset.GenericChangeListener gives ChangeSets
as an argument to DB requests which can leave strong references to the
ChangeSet instances in the DB QueryProcessor until the DB client
garbage collects these requests. Usually DB client request parameters
should be immutable, but in this case the request is never listened to
for changes so it is OK dispose of the ChangeSet parameter after all
DB ChangeListeners are notified.

This change adds a Disposable implementation to ClientChangesImpl which
minimizes the memory footprint of the class down to 192 bytes compared
to ~2^17 bytes. The instances can take up a very considerable amount of
memory if not disposed. It has not been uncommon to see multiple
gigabytes of memory being spent by these byte[] buffers that are not
really used anymore but still referenced.

Once more note that this is not a case of memory leakage but simply bad
use of memory through over-sized buffers that were GC'ed eventually.

refs #6233

Change-Id: I2e96754f106602a4986c37187a9af3bbd64356dc
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClientChangesImpl.java
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/ClusterTable.java
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionImplSocket.java
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/SessionRequestManager.java
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/State.java
bundles/org.simantics.db.procore/src/fi/vtt/simantics/procore/internal/UndoRedoSupportImpl.java
bundles/org.simantics.db/src/org/simantics/db/Disposable.java