Skip to content

Commit fc9a737

Browse files
committed
Remove unecessary fields, reduce method visibility to a minumum, sperate AdditionalReasonInfo from ObjectInfo
1 parent 6cf97bf commit fc9a737

File tree

3 files changed

+63
-94
lines changed

3 files changed

+63
-94
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ProgressReporter.java

Lines changed: 25 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@
5252
import java.util.function.Consumer;
5353
import java.util.stream.Collectors;
5454

55-
import com.oracle.graal.pointsto.reports.ReportUtils;
56-
import com.oracle.svm.util.ReflectionUtil;
5755
import org.graalvm.collections.EconomicMap;
5856
import org.graalvm.collections.Pair;
5957
import org.graalvm.compiler.debug.DebugOptions;
@@ -68,6 +66,7 @@
6866
import com.oracle.graal.pointsto.meta.AnalysisField;
6967
import com.oracle.graal.pointsto.meta.AnalysisMethod;
7068
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
69+
import com.oracle.graal.pointsto.reports.ReportUtils;
7170
import com.oracle.graal.pointsto.util.Timer;
7271
import com.oracle.graal.pointsto.util.TimerCollection;
7372
import com.oracle.svm.core.BuildArtifacts;
@@ -101,6 +100,7 @@
101100
import com.oracle.svm.hosted.reflect.ReflectionHostedSupport;
102101
import com.oracle.svm.hosted.util.VMErrorReporter;
103102
import com.oracle.svm.util.ImageBuildStatistics;
103+
import com.oracle.svm.util.ReflectionUtil;
104104

105105
import jdk.vm.ci.meta.JavaConstant;
106106

@@ -115,9 +115,6 @@ public class ProgressReporter {
115115
private static final double EXCESSIVE_GC_MIN_THRESHOLD_MILLIS = 15_000;
116116
private static final double EXCESSIVE_GC_RATIO = 0.5;
117117
private static final String BREAKDOWN_BYTE_ARRAY_PREFIX = "byte[] for ";
118-
private static final Field STRING_VALUE = ReflectionUtil.lookupField(String.class, "value");
119-
private static final double MILLIS_TO_SECONDS = 1000d;
120-
private static final double NANOS_TO_SECONDS = 1000d * 1000d * 1000d;
121118

122119
private final NativeImageSystemIOWrappers builderIO;
123120

@@ -596,8 +593,6 @@ private void printBreakdowns() {
596593
.jumpToMiddle()
597594
.a(String.format("Top %d object types in image heap:", MAX_NUM_BREAKDOWN)).reset().flushln();
598595

599-
int maxLength = ProgressReporter.CHARACTERS_PER_LINE / 2 - 10;
600-
601596
long printedCodeBytes = 0;
602597
long printedHeapBytes = 0;
603598
long printedCodeItems = 0;
@@ -606,7 +601,7 @@ private void printBreakdowns() {
606601
String codeSizePart = "";
607602
if (packagesBySize.hasNext()) {
608603
Entry<String, Long> e = packagesBySize.next();
609-
String className = Utils.truncateClassOrPackageName(e.getKey(), maxLength);
604+
String className = Utils.truncateClassOrPackageName(e.getKey());
610605
codeSizePart = String.format("%9s %s", ByteFormattingUtil.bytesToHuman(e.getValue()), className);
611606
printedCodeBytes += e.getValue();
612607
printedCodeItems++;
@@ -618,7 +613,7 @@ private void printBreakdowns() {
618613
String className = e.getKey();
619614
// Do not truncate special breakdown items, they can contain links.
620615
if (!className.startsWith(BREAKDOWN_BYTE_ARRAY_PREFIX)) {
621-
className = Utils.truncateClassOrPackageName(className, maxLength);
616+
className = Utils.truncateClassOrPackageName(className);
622617
}
623618
heapSizePart = String.format("%9s %s", ByteFormattingUtil.bytesToHuman(e.getValue()), className);
624619
printedHeapBytes += e.getValue();
@@ -742,22 +737,6 @@ private static Path reportImageBuildStatistics(String imageName, BigBang bb) {
742737
}
743738
}
744739

745-
private static Path reportBuildArtifacts(String imageName, Map<ArtifactType, List<Path>> buildArtifacts) {
746-
Path buildDir = NativeImageGenerator.generatedFiles(HostedOptionValues.singleton());
747-
748-
Consumer<PrintWriter> writerConsumer = writer -> buildArtifacts.forEach((artifactType, paths) -> {
749-
writer.println("[" + artifactType + "]");
750-
if (artifactType == BuildArtifacts.ArtifactType.JDK_LIB_SHIM) {
751-
writer.println("# Note that shim JDK libraries depend on this");
752-
writer.println("# particular native image (including its name)");
753-
writer.println("# and therefore cannot be used with others.");
754-
}
755-
paths.stream().map(Path::toAbsolutePath).map(buildDir::relativize).forEach(writer::println);
756-
writer.println();
757-
});
758-
return com.oracle.graal.pointsto.reports.ReportUtils.report("build artifacts", buildDir.resolve(imageName + ".build_artifacts.txt"), writerConsumer, false);
759-
}
760-
761740
private void printResourceStatistics() {
762741
double totalProcessTimeSeconds = Utils.millisToSeconds(System.currentTimeMillis() - ManagementFactory.getRuntimeMXBean().getStartTime());
763742
GCStats gcStats = GCStats.getCurrent();
@@ -810,34 +789,38 @@ private void recordJsonMetric(JsonMetric metric, Object value) {
810789
/*
811790
* HELPERS
812791
*/
792+
private static class Utils {
793+
private static final double MILLIS_TO_SECONDS = 1000d;
794+
private static final double NANOS_TO_SECONDS = 1000d * 1000d * 1000d;
795+
private static final Field STRING_VALUE = ReflectionUtil.lookupField(String.class, "value");
813796

814-
private static Timer getTimer(TimerCollection.Registry type) {
815-
return TimerCollection.singleton().get(type);
816-
}
797+
private static double millisToSeconds(double millis) {
798+
return millis / MILLIS_TO_SECONDS;
799+
}
817800

818-
private static void resetANSIMode() {
819-
NativeImageSystemIOWrappers.singleton().getOut().print(ANSI.RESET);
820-
}
801+
private static double nanosToSeconds(double nanos) {
802+
return nanos / NANOS_TO_SECONDS;
803+
}
821804

822-
private static class Utils {
823-
public static int getInternalByteArrayLength(String string) {
805+
private static int getInternalByteArrayLength(String string) {
824806
try {
825807
return ((byte[]) STRING_VALUE.get(string)).length;
826808
} catch (ReflectiveOperationException ex) {
827809
throw VMError.shouldNotReachHere(ex);
828810
}
829811
}
830812

831-
static double getUsedMemory() {
813+
private static double getUsedMemory() {
832814
return ByteFormattingUtil.bytesToGiB(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());
833815
}
834816

835-
static String stringFilledWith(int size, String fill) {
817+
private static String stringFilledWith(int size, String fill) {
836818
return new String(new char[size]).replace("\0", fill);
837819
}
838820

839-
static String truncateClassOrPackageName(String classOrPackageName, int maxLength) {
821+
private static String truncateClassOrPackageName(String classOrPackageName) {
840822
int classNameLength = classOrPackageName.length();
823+
int maxLength = CHARACTERS_PER_LINE / 2 - 10;
841824
if (classNameLength <= maxLength) {
842825
return classOrPackageName;
843826
}
@@ -867,14 +850,14 @@ static String truncateClassOrPackageName(String classOrPackageName, int maxLengt
867850
}
868851
return sb.toString();
869852
}
853+
}
870854

871-
public static double millisToSeconds(double millis) {
872-
return millis / MILLIS_TO_SECONDS;
873-
}
855+
private static Timer getTimer(TimerCollection.Registry type) {
856+
return TimerCollection.singleton().get(type);
857+
}
874858

875-
public static double nanosToSeconds(double nanos) {
876-
return nanos / NANOS_TO_SECONDS;
877-
}
859+
private static void resetANSIMode() {
860+
NativeImageSystemIOWrappers.singleton().getOut().print(ANSI.RESET);
878861
}
879862

880863
private static class GCStats {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/ImageHeapConnectedComponentsPrinter.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private static Set<ObjectInfo> removeObjectsBy(NativeImageHeap.ObjectReachabilit
156156
Set<ObjectInfo> result = Collections.newSetFromMap(new IdentityHashMap<>());
157157
if (objectReachabilityGroup == NativeImageHeap.ObjectReachabilityGroup.InternedStringsTable) {
158158
for (ObjectInfo info : objects) {
159-
if (info.getAdditionalReasonInfo().getMainReason().equals(NativeImageHeap.InternalReason.InternedStringsTable)) {
159+
if (info.getMainReason().equals(NativeImageHeap.InternalReason.InternedStringsTable)) {
160160
result.add(info);
161161
objects.remove(info);
162162
return result;
@@ -165,19 +165,21 @@ private static Set<ObjectInfo> removeObjectsBy(NativeImageHeap.ObjectReachabilit
165165
}
166166
for (Iterator<ObjectInfo> iterator = objects.iterator(); iterator.hasNext();) {
167167
ObjectInfo o = iterator.next();
168-
if (o.getAdditionalReasonInfo().objectReachableFrom(objectReachabilityGroup)) {
168+
NativeImageHeap.AdditionalReasonInfo reasonInfo = heap.additionalReasonInfoMap.get(o);
169+
if (reasonInfo.objectReachableFrom(objectReachabilityGroup)) {
169170
result.add(o);
170171
iterator.remove();
171172
}
172173
}
173174
return result;
174175
}
175176

176-
private static Graph<ObjectInfo> constructGraph(Set<ObjectInfo> objects) {
177+
private Graph<ObjectInfo> constructGraph(Set<ObjectInfo> objects) {
177178
Graph<ObjectInfo> graph = new Graph<>();
178179
for (ObjectInfo objectInfo : objects) {
179180
graph.addNode(objectInfo);
180-
for (Object referencesToThisObject : objectInfo.getAdditionalReasonInfo().getAllReasons()) {
181+
NativeImageHeap.AdditionalReasonInfo reasonInfo = heap.additionalReasonInfoMap.get(objectInfo);
182+
for (Object referencesToThisObject : reasonInfo.getAllReasons()) {
181183
if (referencesToThisObject instanceof ObjectInfo && objects.contains(referencesToThisObject)) {
182184
graph.connect((ObjectInfo) referencesToThisObject, objectInfo);
183185
}
@@ -311,10 +313,11 @@ private static String fillHeading(String title) {
311313
return String.format("%s %s %s%s", fill, title, fill, title.length() % 2 == 0 ? "" : "=");
312314
}
313315

314-
private static Set<String> getMethodAccesses(Collection<ObjectInfo> objects) {
316+
private Set<String> getMethodAccesses(Collection<ObjectInfo> objects) {
315317
Set<String> methods = new TreeSet<>();
316318
for (ObjectInfo object : objects) {
317-
for (Object reason : object.getAdditionalReasonInfo().getAllReasons()) {
319+
NativeImageHeap.AdditionalReasonInfo reasonInfo = heap.additionalReasonInfoMap.get(object);
320+
for (Object reason : reasonInfo.getAllReasons()) {
318321
if (reason instanceof String) {
319322
methods.add((String) reason);
320323
}
@@ -332,10 +335,11 @@ private static String formatMethodAsLink(String method) {
332335
}
333336
}
334337

335-
private static Set<HostedField> getHostedFieldsAccess(Collection<ObjectInfo> objects) {
338+
private Set<HostedField> getHostedFieldsAccess(Collection<ObjectInfo> objects) {
336339
Set<HostedField> hostedFields = Collections.newSetFromMap(new IdentityHashMap<>());
337340
for (ObjectInfo object : objects) {
338-
for (Object reason : object.getAdditionalReasonInfo().getAllReasons()) {
341+
NativeImageHeap.AdditionalReasonInfo reasonInfo = heap.additionalReasonInfoMap.get(object);
342+
for (Object reason : reasonInfo.getAllReasons()) {
339343
if (reason instanceof HostedField) {
340344
hostedFields.add((HostedField) reason);
341345
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageHeap.java

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ public final class NativeImageHeap implements ImageHeap {
127127
/** Objects that are known to be immutable in the native image heap. */
128128
private final Set<Object> knownImmutableObjects = Collections.newSetFromMap(new IdentityHashMap<>());
129129

130+
/** For diagnostic purpose only. */
131+
HashMap<ObjectInfo, AdditionalReasonInfo> additionalReasonInfoMap = null;
132+
130133
public NativeImageHeap(AnalysisUniverse aUniverse, HostedUniverse universe, HostedMetaAccess metaAccess, ImageHeapLayouter heapLayouter) {
131134
this.aUniverse = aUniverse;
132135
this.universe = universe;
@@ -137,6 +140,9 @@ public NativeImageHeap(AnalysisUniverse aUniverse, HostedUniverse universe, Host
137140

138141
this.minInstanceSize = objectLayout.getMinimumInstanceObjectSize();
139142
this.minArraySize = objectLayout.getMinimumArraySize();
143+
if (ImageHeapConnectedComponentsFeature.Options.PrintImageHeapConnectedComponents.getValue()) {
144+
this.additionalReasonInfoMap = new HashMap<>();
145+
}
140146
assert assertFillerObjectSizes();
141147
}
142148

@@ -318,7 +324,7 @@ public void addConstant(final JavaConstant constant, boolean immutableFromParent
318324
if (existing == null) {
319325
addObjectToImageHeap(uncompressed, immutableFromParent, identityHashCode, reason);
320326
} else if (ImageHeapConnectedComponentsFeature.Options.PrintImageHeapConnectedComponents.getValue()) {
321-
existing.addReason(reason);
327+
additionalReasonInfoMap.get(existing).addReason(reason);
322328
}
323329
}
324330

@@ -702,50 +708,46 @@ static class AddObjectData {
702708

703709
private final int imageHeapOffsetInAddressSpace = Heap.getHeap().getImageHeapOffsetInAddressSpace();
704710

705-
public enum InternalReason {
711+
enum InternalReason {
706712
InternedStringsTable,
707713
FillerObject,
708714
StaticObjectFields,
709715
DataSection,
710716
StaticPrimitiveFields
711717
}
712718

713-
public final class AdditionalReasonInfo {
714-
private final Object firstReason; // ObjectInfo, String, HostedField, InternalReason
719+
final class AdditionalReasonInfo {
720+
private final Object firstReason;
715721
private LinkedHashSet<Object> allReasons;
716722
private int objectReachability;
717723

718-
public AdditionalReasonInfo(ObjectInfo info, Object reason) {
719-
this.firstReason = reason;
724+
AdditionalReasonInfo(ObjectInfo info, Object firstReason) {
725+
this.firstReason = firstReason;
720726
this.allReasons = null;
721-
this.objectReachability = ObjectReachabilityGroup.getFlagForObjectInfo(info, reason);
727+
this.objectReachability = ObjectReachabilityGroup.getFlagForObjectInfo(info, firstReason, additionalReasonInfoMap);
722728
}
723729

724-
public void addReason(Object additionalReason) {
730+
void addReason(Object additionalReason) {
725731
if (allReasons == null) {
726732
this.allReasons = new LinkedHashSet<>();
727733
}
728734
this.allReasons.add(additionalReason);
729-
this.objectReachability |= ObjectReachabilityGroup.getByReason(additionalReason);
735+
this.objectReachability |= ObjectReachabilityGroup.getByReason(additionalReason, additionalReasonInfoMap);
730736
}
731737

732-
public Set<Object> getAllReasons() {
738+
Set<Object> getAllReasons() {
733739
if (allReasons == null) {
734740
this.allReasons = new LinkedHashSet<>();
735741
}
736742
this.allReasons.add(firstReason);
737743
return this.allReasons;
738744
}
739745

740-
public Object getMainReason() {
741-
return this.firstReason;
742-
}
743-
744-
public int getObjectReachability() {
746+
int getObjectReachability() {
745747
return objectReachability;
746748
}
747749

748-
public boolean objectReachableFrom(ObjectReachabilityGroup objectReachabilityGroup) {
750+
boolean objectReachableFrom(ObjectReachabilityGroup objectReachabilityGroup) {
749751
return (this.objectReachability & objectReachabilityGroup.flag) != 0;
750752
}
751753
}
@@ -786,12 +788,10 @@ public final class ObjectInfo implements ImageHeapObject {
786788
this.identityHashCode = identityHashCode;
787789

788790
// For diagnostic purposes only
791+
this.reason = reason;
789792
if (ImageHeapConnectedComponentsFeature.Options.PrintImageHeapConnectedComponents.getValue()) {
790-
this.reason = new AdditionalReasonInfo(this, reason);
791-
} else {
792-
this.reason = reason;
793+
additionalReasonInfoMap.put(this, new AdditionalReasonInfo(this, reason));
793794
}
794-
795795
}
796796

797797
@Override
@@ -877,23 +877,8 @@ int getIdentityHashCode() {
877877
return identityHashCode;
878878
}
879879

880-
private void addReason(Object additionalReason) {
881-
assert ImageHeapConnectedComponentsFeature.Options.PrintImageHeapConnectedComponents.getValue();
882-
assert this.reason instanceof AdditionalReasonInfo;
883-
((AdditionalReasonInfo) this.reason).addReason(additionalReason);
884-
}
885-
886880
public Object getMainReason() {
887-
if (this.reason instanceof AdditionalReasonInfo) {
888-
return ((AdditionalReasonInfo) this.reason).firstReason;
889-
} else {
890-
return this.reason;
891-
}
892-
}
893-
894-
public AdditionalReasonInfo getAdditionalReasonInfo() {
895-
assert this.reason instanceof AdditionalReasonInfo;
896-
return (AdditionalReasonInfo) this.reason;
881+
return this.reason;
897882
}
898883

899884
@Override
@@ -966,7 +951,7 @@ private enum PhaseValue {
966951
* {@code ImageHeapConnectedComponentsFeature.Options.PrintImageHeapConnectedComponents} is
967952
* enabled.
968953
*/
969-
public enum ObjectReachabilityGroup {
954+
enum ObjectReachabilityGroup {
970955
Resources(1 << 1),
971956
InternedStringsTable(1 << 2),
972957
DynamicHubs(1 << 3),
@@ -980,29 +965,26 @@ public enum ObjectReachabilityGroup {
980965
this.flag = flag;
981966
}
982967

983-
public static int getFlagForObjectInfo(ObjectInfo object, Object firstReason) {
968+
static int getFlagForObjectInfo(ObjectInfo object, Object firstReason, HashMap<ObjectInfo, AdditionalReasonInfo> additionalReasonInfoHashMap) {
984969
int result = 0;
985970
if (object.getObjectClass().equals(ImageCodeInfo.class)) {
986971
result |= ImageCodeInfo.flag;
987972
}
988973
if (object.getObject().getClass().equals(DynamicHub.class) || object.getObject().getClass().equals(DynamicHubCompanion.class)) {
989974
result |= DynamicHubs.flag;
990975
}
991-
result |= getByReason(firstReason);
976+
result |= getByReason(firstReason, additionalReasonInfoHashMap);
992977
return result;
993978
}
994979

995-
public static int getByReason(Object reason) {
980+
static int getByReason(Object reason, HashMap<ObjectInfo, AdditionalReasonInfo> additionalReasonInfoHashMap) {
996981
if (reason.equals(InternalReason.InternedStringsTable)) {
997982
return ObjectReachabilityGroup.ImageCodeInfo.flag;
998983
} else if (reason instanceof String || reason instanceof HostedField) {
999984
return ObjectReachabilityGroup.MethodOrStaticField.flag;
1000985
} else if (reason instanceof ObjectInfo) {
1001986
ObjectInfo r = (ObjectInfo) reason;
1002-
return r.getAdditionalReasonInfo().getObjectReachability();
1003-
} else if (reason instanceof AdditionalReasonInfo) {
1004-
AdditionalReasonInfo reasonInfo = (AdditionalReasonInfo) reason;
1005-
return reasonInfo.getObjectReachability();
987+
return additionalReasonInfoHashMap.get(r).getObjectReachability();
1006988
}
1007989
return ObjectReachabilityGroup.Other.flag;
1008990
}

0 commit comments

Comments
 (0)