From 07710b8d5004ddfc203ff18a2c3f7a361f952c52 Mon Sep 17 00:00:00 2001 From: Tuukka Lehtonen Date: Fri, 5 Jun 2020 01:33:16 +0300 Subject: [PATCH] Avoid useless reallocation of empty TreeMaps and map iterators The problem was that when the database is doing work, MainProgram.run runs in pretty much busy loop mode and previously it was always allocating a new TreeMap on each round and also calling Map.entrySet() to get construct iterators for empty TreeMaps which eventually accumulates up to somewhat signinificant amount of memory allocated. Possibly an even more efficient way would be to have the Map be a closed hashing hashmap instead and then sorting the data for iteration separately. gitlab #548 Change-Id: Ib2208dc35b270c9d682362d45f24f1fe01bb8969 (cherry picked from commit d3f7c0196ecf58b78574d8b80e1844ecb4e223d6) --- .../src/org/simantics/acorn/MainProgram.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/MainProgram.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/MainProgram.java index ec4d56c21..ff0ab4938 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/MainProgram.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/MainProgram.java @@ -70,7 +70,7 @@ public class MainProgram implements Runnable, Closeable { this.updateSchedules = new ArrayList[CLUSTER_THREADS]; for(int i=0;i(); + updateSchedules[i] = new ArrayList<>(); } } @@ -93,11 +93,13 @@ public class MainProgram implements Runnable, Closeable { try { + TreeMap> updates = new TreeMap<>(clusterComparator); + main: while(alive) { - TreeMap> updates = new TreeMap>(clusterComparator); - + if (!updates.isEmpty()) + updates.clear(); operationQueue.pumpUpdates(updates); if(updates.isEmpty()) { @@ -167,6 +169,9 @@ public class MainProgram implements Runnable, Closeable { for(int i=0;i> entry : updates.entrySet()) { -- 2.47.1