Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 17135)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 17136)
@@ -425,6 +425,10 @@
         }
         targetDataSet.update(() -> {
-            List<? extends OsmPrimitive> candidates = new ArrayList<>(targetDataSet.getNodes());
+            List<? extends OsmPrimitive> candidates = null;
             for (Node node: sourceDataSet.getNodes()) {
+                // lazy initialisation to improve performance, see #19898
+                if (candidates == null) {
+                    candidates = new ArrayList<>(targetDataSet.getNodes());
+                }
                 mergePrimitive(node, candidates);
                 if (progressMonitor != null) {
@@ -432,7 +436,10 @@
                 }
             }
-            candidates.clear();
-            candidates = new ArrayList<>(targetDataSet.getWays());
+            candidates = null;
             for (Way way: sourceDataSet.getWays()) {
+                // lazy initialisation to improve performance
+                if (candidates == null) {
+                    candidates = new ArrayList<>(targetDataSet.getWays());
+                }
                 mergePrimitive(way, candidates);
                 if (progressMonitor != null) {
@@ -440,7 +447,10 @@
                 }
             }
-            candidates.clear();
-            candidates = new ArrayList<>(targetDataSet.getRelations());
+            candidates = null;
             for (Relation relation: sourceDataSet.getRelations()) {
+                // lazy initialisation to improve performance
+                if (candidates == null) {
+                    candidates = new ArrayList<>(targetDataSet.getRelations());
+                }
                 mergePrimitive(relation, candidates);
                 if (progressMonitor != null) {
@@ -448,5 +458,5 @@
                 }
             }
-            candidates.clear();
+            candidates = null;
             fixReferences();
 
Index: /trunk/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java	(revision 17135)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java	(revision 17136)
@@ -215,6 +215,6 @@
         progressMonitor.beginTask(null, 2);
         try {
-            Collection<Way> waysToCheck = new ArrayList<>(ds.getWays());
             if (isReadFull() || (primitiveType == OsmPrimitiveType.NODE && !isAllowIncompleteParentWays())) {
+                Collection<Way> waysToCheck = new ArrayList<>(ds.getWays());
                 for (Way way: waysToCheck) {
                     if (!way.isNew() && way.hasIncompleteNodes()) {
