private static StringBuilder fillReasonStack(StringBuilder msg, Object reason) { if (reason instanceof ObjectInfo) { ObjectInfo info = (ObjectInfo) reason; msg.append(" object: ").append(info.getObject()).append(" of class: ").append(info.getObject().getClass().getTypeName()).append(System.lineSeparator()); return fillReasonStack(msg, info.reason); } return msg.append(" root: ").append(reason).append(System.lineSeparator()); }
@Override public String toString() { StringBuilder result = new StringBuilder(getObject().getClass().getName()).append(" -> "); Object cur = reason; Object prev = null; boolean skipped = false; while (cur instanceof ObjectInfo) { skipped = prev != null; prev = cur; cur = ((ObjectInfo) cur).reason; } if (skipped) { result.append("... -> "); } if (prev != null) { result.append(prev); } else { result.append(cur); } return result.toString(); }
private static boolean filterDynamicHubField(ObjectInfo info, HostedField field) { if (info.getObject() instanceof DynamicHub) { return field.getName().equals("name") || field.getName().equals("assignableFromMatches") || field.getName().equals("pointerMapEncoding"); } return true; }
try (Indent perHeapIndent = debug.logAndIndent("BootImageHeap.writeHeap:")) { for (ObjectInfo info : objects.values()) { assert !blacklist.contains(info.getObject()); writeObject(info, roBuffer, rwBuffer);
private void processObject(ObjectInfo info, String group, boolean addObject, int recursionLevel, ObjectFilter objectFilter, FieldFilter fieldFilter) { if (objectFilter != null && !objectFilter.test(info, recursionLevel)) { return; } assert info != null; if (addObject) { if (!addToGroup(info, group)) { return; } } if (info.getClazz().isInstanceClass()) { JavaConstant con = SubstrateObjectConstant.forObject(info.getObject()); for (HostedField field : info.getClazz().getInstanceFields(true)) { if (field.getType().getStorageKind() == JavaKind.Object && !HybridLayout.isHybridField(field) && field.isAccessed()) { if (fieldFilter == null || fieldFilter.test(info, field)) { Object fieldValue = SubstrateObjectConstant.asObject(field.readStorageValue(con)); if (fieldValue != null) { processObject(heap.objects.get(fieldValue), group, true, recursionLevel + 1, objectFilter, fieldFilter); } } } } } else if (info.getObject() instanceof Object[]) { for (Object element : (Object[]) info.getObject()) { if (element != null) { processObject(heap.objects.get(element), group, true, recursionLevel + 1, objectFilter, fieldFilter); } } } }
public void add(ObjectInfo objectInfo, long size) { assert NativeImageOptions.PrintHeapHistogram.getValue(); HistogramEntry entry = data.get(objectInfo.getClazz()); if (entry == null) { entry = new HistogramEntry(objectInfo.getClazz()); data.put(objectInfo.getClazz(), entry); } entry.count++; entry.size += size; if (PrintStrings && objectInfo.getObject() instanceof String) { String reason = String.valueOf(objectInfo.reason); String value = ((String) objectInfo.getObject()).replace("\n", ""); if (!reason.startsWith("com.oracle.svm.core.hub.DynamicHub")) { System.out.format("%120s ::: %s\n", value, reason); } } }
long allocate(ObjectInfo info) { Object object = info.getObject(); lastAllocatedObject = object; if (firstAllocatedObject == null) { firstAllocatedObject = object; } long position = size; incrementSize(info.getSize()); incrementCount(); return position; }
public void processType(Class<?> clazz, String group, boolean addObject, ObjectFilter objectFilter, FieldFilter fieldFilter) { for (ObjectInfo info : objects) { if (clazz.isInstance(info.getObject())) { processObject(info, group, addObject, 1, objectFilter, fieldFilter); } } }
private static boolean filterObjectConstantField(ObjectInfo info, HostedField field) { if (info.getObject() instanceof SubstrateObjectConstant) { return !field.getName().equals("object"); } return true; }