Index: /trunk/src/org/openstreetmap/josm/io/AbstractParser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/AbstractParser.java	(revision 18955)
+++ /trunk/src/org/openstreetmap/josm/io/AbstractParser.java	(revision 18956)
@@ -5,4 +5,6 @@
 
 import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -31,4 +33,5 @@
     /** if true, replace user information in input by anonymous user */
     protected boolean useAnonymousUser;
+    private Map<RelationMemberData, RelationMemberData> memberCache = new HashMap<>();
 
     @Override
@@ -182,5 +185,9 @@
         String role = getMandatoryAttributeString(atts, "role");
         RelationMemberData member = new RelationMemberData(role, type, ref);
-        ((HistoryRelation) currentPrimitive).addMember(member);
+        // see #20405: cache equal instances of members
+        RelationMemberData cachedMember = memberCache .putIfAbsent(member, member);
+        if (cachedMember == null)
+            cachedMember = member;
+        ((HistoryRelation) currentPrimitive).addMember(cachedMember);
     }
 
