diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/AgentObjectSizeFactory.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/AgentObjectSizeFactory.java index 85c44026426c8740cc9155fb4b5212df37939219..bab299694f7bda289d97a568ed56cfddd44c9729 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/AgentObjectSizeFactory.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/AgentObjectSizeFactory.java @@ -34,6 +34,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.jar.Attributes; import java.util.jar.JarEntry; @@ -123,10 +124,14 @@ public class AgentObjectSizeFactory extends ObjectSizeFactory { @Override public long getObjectSize(Object obj, IgnoreObjectHandler ignoreObjectHandler) { - return getObjectSize(obj, obj, ignoreObjectHandler); + return getObjectSize(obj, obj, ignoreObjectHandler, new HashSet<>()); } - private long getObjectSize(Object rootObj, Object obj, IgnoreObjectHandler ignoreObjectHandler) { + private long getObjectSize(Object rootObj, Object obj, IgnoreObjectHandler ignoreObjectHandler, HashSet<Object> visited) { + if (visited.contains(obj)) { + return 0; + } + visited.add(obj); try { long basicSize = ObjSizeAgent.objectSize(obj); long size = basicSize; @@ -137,7 +142,7 @@ public class AgentObjectSizeFactory extends ObjectSizeFactory { if (elem == null || isNa(elem)) { continue; } else { - size += getObjectSize(rootObj, elem, ignoreObjectHandler); + size += getObjectSize(rootObj, elem, ignoreObjectHandler, visited); } } } else { @@ -154,7 +159,7 @@ public class AgentObjectSizeFactory extends ObjectSizeFactory { } else { TypeCustomizer typeCustomizer = getCustomizer(fieldObj.getClass()); if (typeCustomizer == null) { - size += getObjectSize(rootObj, fieldObj, ignoreObjectHandler); + size += getObjectSize(rootObj, fieldObj, ignoreObjectHandler, visited); } else { size += typeCustomizer.getObjectSize(fieldObj); }