From d6a64513e0d092b6c5f17d13b5c04a87a3f0e7ee Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Wed, 13 Aug 2025 12:49:21 +0200 Subject: [PATCH] Only calculate resource stats if reachable. --- .../oracle/svm/hosted/HeapBreakdownProvider.java | 13 ++++++++----- .../oracle/svm/hosted/ProgressReporterFeature.java | 9 ++++++++- .../webimage/WebImageJSHeapBreakdownProvider.java | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java index f2f19693767e..80e1c14c9554 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/HeapBreakdownProvider.java @@ -97,7 +97,7 @@ protected void setTotalHeapSize(long totalHeapSize) { this.totalHeapSize = totalHeapSize; } - protected void calculate(BeforeImageWriteAccessImpl access) { + protected void calculate(BeforeImageWriteAccessImpl access, boolean resourcesAreReachable) { HostedMetaAccess metaAccess = access.getHostedMetaAccess(); ObjectLayout objectLayout = ImageSingletons.lookup(ObjectLayout.class); @@ -160,10 +160,13 @@ protected void calculate(BeforeImageWriteAccessImpl access) { addEntry(entries, byteArrayEntry, new HeapBreakdownEntry(BYTE_ARRAY_PREFIX, "reflection metadata", "#glossary-reflection-metadata"), metadataSize, 1); } ProgressReporter reporter = ProgressReporter.singleton(); - /* GR-57350: This condition can be removed once resources are adapted for Layered Images */ - if (!ImageLayerBuildingSupport.buildingExtensionLayer()) { + long resourcesByteArraySize = 0; + /* + * GR-57350: The first part of this condition can be removed once resources are adapted for + * Layered Images. + */ + if (!ImageLayerBuildingSupport.buildingExtensionLayer() && resourcesAreReachable) { /* Extract byte[] for resources. */ - long resourcesByteArraySize = 0; int resourcesByteArrayCount = 0; for (ConditionalRuntimeValue resourceList : Resources.currentLayer().resources()) { if (resourceList.getValueUnconditionally().hasData()) { @@ -173,11 +176,11 @@ protected void calculate(BeforeImageWriteAccessImpl access) { } } } - reporter.recordJsonMetric(ImageDetailKey.RESOURCE_SIZE_BYTES, resourcesByteArraySize); if (resourcesByteArraySize > 0) { addEntry(entries, byteArrayEntry, new HeapBreakdownEntry(BYTE_ARRAY_PREFIX, "embedded resources", "#glossary-embedded-resources"), resourcesByteArraySize, resourcesByteArrayCount); } } + reporter.recordJsonMetric(ImageDetailKey.RESOURCE_SIZE_BYTES, resourcesByteArraySize); /* Extract byte[] for graph encodings. */ if (graphEncodingByteLength >= 0) { long graphEncodingSize = objectLayout.getArraySize(JavaKind.Byte, graphEncodingByteLength, true); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ProgressReporterFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ProgressReporterFeature.java index 431fec1318f3..4a043ef8df90 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ProgressReporterFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ProgressReporterFeature.java @@ -37,6 +37,7 @@ import com.oracle.svm.core.SubstrateUtil; import com.oracle.svm.core.feature.AutomaticallyRegisteredFeature; import com.oracle.svm.core.feature.InternalFeature; +import com.oracle.svm.core.jdk.resources.NativeImageResourceFileSystem; import com.oracle.svm.core.jni.access.JNIAccessibleClass; import com.oracle.svm.core.jni.access.JNIReflectionDictionary; import com.oracle.svm.hosted.FeatureImpl.AfterCompilationAccessImpl; @@ -51,6 +52,7 @@ @AutomaticallyRegisteredFeature public class ProgressReporterFeature implements InternalFeature { protected final ProgressReporter reporter = ProgressReporter.singleton(); + private boolean resourcesAreReachable; @Override public void duringSetup(DuringSetupAccess access) { @@ -71,10 +73,15 @@ public void afterCompilation(AfterCompilationAccess access) { } } + @Override + public void afterAnalysis(AfterAnalysisAccess access) { + resourcesAreReachable = access.isReachable(NativeImageResourceFileSystem.class); + } + @Override public void beforeImageWrite(BeforeImageWriteAccess access) { if (SubstrateOptions.BuildOutputBreakdowns.getValue()) { - HeapBreakdownProvider.singleton().calculate(((BeforeImageWriteAccessImpl) access)); + HeapBreakdownProvider.singleton().calculate(((BeforeImageWriteAccessImpl) access), resourcesAreReachable); } } diff --git a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageJSHeapBreakdownProvider.java b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageJSHeapBreakdownProvider.java index 4ee725d79e94..c8e29c7cdc2c 100644 --- a/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageJSHeapBreakdownProvider.java +++ b/web-image/src/com.oracle.svm.hosted.webimage/src/com/oracle/svm/hosted/webimage/WebImageJSHeapBreakdownProvider.java @@ -47,7 +47,7 @@ public class WebImageJSHeapBreakdownProvider extends HeapBreakdownProvider { * of bytes used if they were laid out in binary without alignment gaps. */ @Override - protected void calculate(FeatureImpl.BeforeImageWriteAccessImpl access) { + protected void calculate(FeatureImpl.BeforeImageWriteAccessImpl access, boolean resourcesAreReachable) { long totalByteSize = 0; WebImageJSProviders providers = (WebImageJSProviders) ImageSingletons.lookup(WebImageProviders.class); ConstantIdentityMapping identityMapping = providers.typeControl().getConstantMap().identityMapping;