Skip to content

Commit 2aa1013

Browse files
Fix heap dumping issues.
1 parent df624d2 commit 2aa1013

File tree

9 files changed

+38
-34
lines changed

9 files changed

+38
-34
lines changed

compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/LibGraalSupportImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import java.util.Map;
3636
import java.util.function.Supplier;
3737

38-
import jdk.graal.compiler.options.OptionValues;
3938
import org.graalvm.collections.EconomicMap;
4039
import org.graalvm.collections.EconomicSet;
4140
import org.graalvm.collections.MapCursor;
@@ -49,13 +48,14 @@
4948
import org.graalvm.nativeimage.RuntimeOptions;
5049
import org.graalvm.nativeimage.StackValue;
5150
import org.graalvm.nativeimage.VMRuntime;
52-
import org.graalvm.nativeimage.libgraal.hosted.LibGraalLoader;
5351
import org.graalvm.nativeimage.libgraal.LibGraalRuntime;
5452
import org.graalvm.nativeimage.libgraal.hosted.GlobalData;
53+
import org.graalvm.nativeimage.libgraal.hosted.LibGraalLoader;
5554

5655
import jdk.graal.compiler.core.common.LibGraalSupport;
5756
import jdk.graal.compiler.debug.GraalError;
5857
import jdk.graal.compiler.libgraal.truffle.HSTruffleCompilerRuntime;
58+
import jdk.graal.compiler.options.OptionValues;
5959
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
6060
import jdk.graal.compiler.word.Word;
6161
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
@@ -162,7 +162,7 @@ public void processReferences() {
162162
}
163163

164164
@Override
165-
public void dumpHeap(String outputFile, boolean live) throws IOException {
165+
public void dumpHeap(String outputFile, boolean live) throws IOException, UnsupportedOperationException {
166166
VMRuntime.dumpHeap(outputFile, live);
167167
}
168168

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/GraalCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ private static <T extends CompilationResult> void checkForHeapDump(Request<T> re
175175
try {
176176
final String path = debug.getDumpPath(".compilation.hprof", false);
177177
GraalServices.dumpHeap(path, false);
178-
} catch (IOException e) {
178+
} catch (IOException | UnsupportedOperationException e) {
179179
e.printStackTrace(System.out);
180180
}
181181
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/phases/BasePhase.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,17 @@
3434
import java.util.Optional;
3535
import java.util.regex.Pattern;
3636

37-
import jdk.graal.compiler.core.GraalCompilerOptions;
38-
import jdk.graal.compiler.debug.GraphFilter;
39-
import jdk.graal.compiler.serviceprovider.GraalServices;
4037
import org.graalvm.collections.EconomicMap;
4138

39+
import jdk.graal.compiler.core.GraalCompilerOptions;
4240
import jdk.graal.compiler.core.common.util.CompilationAlarm;
4341
import jdk.graal.compiler.debug.CounterKey;
4442
import jdk.graal.compiler.debug.DebugCloseable;
4543
import jdk.graal.compiler.debug.DebugContext;
4644
import jdk.graal.compiler.debug.DebugContext.CompilerPhaseScope;
4745
import jdk.graal.compiler.debug.DebugOptions;
4846
import jdk.graal.compiler.debug.GraalError;
47+
import jdk.graal.compiler.debug.GraphFilter;
4948
import jdk.graal.compiler.debug.MemUseTrackerKey;
5049
import jdk.graal.compiler.debug.TTY;
5150
import jdk.graal.compiler.debug.TimerKey;
@@ -65,6 +64,7 @@
6564
import jdk.graal.compiler.options.OptionValues;
6665
import jdk.graal.compiler.phases.contract.NodeCostUtil;
6766
import jdk.graal.compiler.phases.contract.PhaseSizeContract;
67+
import jdk.graal.compiler.serviceprovider.GraalServices;
6868
import jdk.vm.ci.meta.SpeculationLog;
6969

7070
/**
@@ -506,7 +506,7 @@ public final void apply(final StructuredGraph graph, final C context, final bool
506506
try {
507507
final String path = debug.getDumpPath("_" + getName() + ".hprof", false);
508508
GraalServices.dumpHeap(path, false);
509-
} catch (IOException e) {
509+
} catch (IOException | UnsupportedOperationException e) {
510510
e.printStackTrace(System.out);
511511
}
512512
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/serviceprovider/GraalServices.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,9 @@
4141
import jdk.graal.compiler.core.ArchitectureSpecific;
4242
import jdk.graal.compiler.core.common.LibGraalSupport;
4343
import jdk.graal.compiler.core.common.NativeImageSupport;
44-
import jdk.vm.ci.code.Architecture;
45-
4644
import jdk.graal.compiler.debug.GraalError;
4745
import jdk.internal.misc.VM;
46+
import jdk.vm.ci.code.Architecture;
4847
import jdk.vm.ci.meta.EncodedSpeculationReason;
4948
import jdk.vm.ci.meta.SpeculationLog.SpeculationReason;
5049
import jdk.vm.ci.runtime.JVMCI;
@@ -498,7 +497,7 @@ public static List<String> getInputArguments() {
498497
* @throws IOException if an IO error occurred dyring dumping
499498
* @throws UnsupportedOperationException if this operation is not supported.
500499
*/
501-
public static void dumpHeap(String outputFile, boolean live) throws IOException {
500+
public static void dumpHeap(String outputFile, boolean live) throws IOException, UnsupportedOperationException {
502501
LibGraalSupport libgraal = LibGraalSupport.INSTANCE;
503502
if (libgraal != null) {
504503
libgraal.dumpHeap(outputFile, live);

sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/VMRuntime.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -86,9 +86,6 @@ public static void shutdown() {
8686
* @since 20.1
8787
*/
8888
public static void dumpHeap(String outputFile, boolean live) throws IOException {
89-
if (!ImageSingletons.contains(HeapDumpSupport.class)) {
90-
throw new UnsupportedOperationException();
91-
}
9289
ImageSingletons.lookup(HeapDumpSupport.class).dumpHeap(outputFile, live);
9390
}
9491

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,6 @@ public final class VMInspectionOptions {
7878
", '" + MONITORING_JCMD_NAME + "' (experimental)" +
7979
", or '" + MONITORING_ALL_NAME + "' (deprecated behavior: defaults to '" + MONITORING_ALL_NAME + "' if no argument is provided)";
8080

81-
static {
82-
assert MONITORING_ALL_VALUES.stream().allMatch(v -> MONITORING_DEFAULT_NAME.equals(v) || MONITORING_ALLOWED_VALUES_TEXT.contains(v)) : "A value is missing in the user-facing help text";
83-
}
84-
8581
@APIOption(name = ENABLE_MONITORING_OPTION, defaultValue = MONITORING_DEFAULT_NAME) //
8682
@Option(help = "Enable monitoring features that allow the VM to be inspected at run time. Comma-separated list can contain " + MONITORING_ALLOWED_VALUES_TEXT + ". " +
8783
"For example: '--" + ENABLE_MONITORING_OPTION + "=" + MONITORING_HEAPDUMP_NAME + "," + MONITORING_JFR_NAME + "'.", type = OptionType.User) //
@@ -92,6 +88,10 @@ public final class VMInspectionOptions {
9288
@Option(help = "Dumps all runtime compiled methods on SIGUSR2.", type = OptionType.User) //
9389
public static final HostedOptionKey<Boolean> DumpRuntimeCompilationOnSignal = new HostedOptionKey<>(false, VMInspectionOptions::notSupportedOnWindows);
9490

91+
static {
92+
assert MONITORING_ALL_VALUES.stream().allMatch(v -> MONITORING_DEFAULT_NAME.equals(v) || MONITORING_ALLOWED_VALUES_TEXT.contains(v)) : "A value is missing in the user-facing help text";
93+
}
94+
9595
@Platforms(Platform.HOSTED_ONLY.class)
9696
private static void notSupportedOnWindows(HostedOptionKey<Boolean> optionKey) {
9797
if (Platform.includedIn(WINDOWS.class) && optionKey.getValue()) {
@@ -136,8 +136,9 @@ private static String getDefaultMonitoringCommandArgument() {
136136
}
137137

138138
@Fold
139-
public static String getHeapDumpCommandArgument() {
140-
return SubstrateOptionsParser.commandArgument(EnableMonitoringFeatures, MONITORING_HEAPDUMP_NAME);
139+
public static String getHeapDumpNotSupportedMessage() {
140+
return "Unable to dump heap. Heap dumping is only supported on Linux and MacOS for native binaries built with '" +
141+
SubstrateOptionsParser.commandArgument(EnableMonitoringFeatures, MONITORING_HEAPDUMP_NAME) + "'.";
141142
}
142143

143144
private static Set<String> getEnabledMonitoringFeatures() {
@@ -167,8 +168,7 @@ public static boolean dumpImageHeap() {
167168
System.out.println("Heap dump created at '" + absoluteHeapDumpPath + "'.");
168169
return true;
169170
} else {
170-
System.out.println("Unable to dump heap. Heap dumping is only supported on Linux and MacOS for native executables built with '" +
171-
VMInspectionOptions.getHeapDumpCommandArgument() + "'.");
171+
System.out.println(VMInspectionOptions.getHeapDumpNotSupportedMessage());
172172
return false;
173173
}
174174
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/dump/HeapDumpSupportImpl.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
import java.io.IOException;
3030

31-
import jdk.graal.compiler.word.Word;
3231
import org.graalvm.nativeimage.Platform;
3332
import org.graalvm.nativeimage.Platforms;
3433
import org.graalvm.nativeimage.StackValue;
@@ -39,6 +38,7 @@
3938
import org.graalvm.word.Pointer;
4039

4140
import com.oracle.svm.core.UnmanagedMemoryUtil;
41+
import com.oracle.svm.core.VMInspectionOptions;
4242
import com.oracle.svm.core.heap.GCCause;
4343
import com.oracle.svm.core.heap.Heap;
4444
import com.oracle.svm.core.heap.RestrictHeapAccess;
@@ -55,6 +55,7 @@
5555
import com.oracle.svm.core.util.TimeUtils;
5656

5757
import jdk.graal.compiler.api.replacements.Fold;
58+
import jdk.graal.compiler.word.Word;
5859

5960
public class HeapDumpSupportImpl extends HeapDumping {
6061
private final HeapDumpWriter writer;
@@ -133,6 +134,10 @@ private void dumpHeapOnOutOfMemoryError0() {
133134

134135
@Override
135136
public void dumpHeap(String filename, boolean gcBefore, boolean overwrite) throws IOException {
137+
if (!RawFileOperationSupport.isPresent()) {
138+
throw new UnsupportedOperationException(VMInspectionOptions.getHeapDumpNotSupportedMessage());
139+
}
140+
136141
FileCreationMode creationMode = overwrite ? FileCreationMode.CREATE_OR_REPLACE : FileCreationMode.CREATE;
137142
RawFileDescriptor fd = getFileSupport().create(filename, creationMode, RawFileOperationSupport.FileAccessMode.READ_WRITE);
138143
if (!getFileSupport().isValid(fd)) {

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/substitutions/GraalSubstitutions.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
import java.util.Map;
3535
import java.util.concurrent.ConcurrentHashMap;
3636

37-
import com.oracle.svm.core.Isolates;
38-
import jdk.graal.compiler.graph.Edges;
3937
import org.graalvm.collections.EconomicMap;
4038
import org.graalvm.collections.EconomicSet;
4139
import org.graalvm.collections.Equivalence;
@@ -44,7 +42,9 @@
4442
import org.graalvm.nativeimage.VMRuntime;
4543
import org.graalvm.nativeimage.hosted.FieldValueTransformer;
4644

45+
import com.oracle.svm.core.Isolates;
4746
import com.oracle.svm.core.SubstrateTargetDescription;
47+
import com.oracle.svm.core.VMInspectionOptions;
4848
import com.oracle.svm.core.annotate.Alias;
4949
import com.oracle.svm.core.annotate.Inject;
5050
import com.oracle.svm.core.annotate.InjectAccessors;
@@ -74,6 +74,7 @@
7474
import jdk.graal.compiler.debug.MetricKey;
7575
import jdk.graal.compiler.debug.TTY;
7676
import jdk.graal.compiler.debug.TimeSource;
77+
import jdk.graal.compiler.graph.Edges;
7778
import jdk.graal.compiler.graph.Node;
7879
import jdk.graal.compiler.lir.gen.ArithmeticLIRGeneratorTool;
7980
import jdk.graal.compiler.lir.phases.LIRPhase;
@@ -232,7 +233,10 @@ final class Target_jdk_graal_compiler_serviceprovider_GraalServices {
232233
* {@code jdk.graal.compiler.management.JMXServiceProvider}.
233234
*/
234235
@Substitute
235-
public static void dumpHeap(String outputFile, boolean live) throws IOException {
236+
public static void dumpHeap(String outputFile, boolean live) throws IOException, UnsupportedOperationException {
237+
if (!VMInspectionOptions.hasHeapDumpSupport()) {
238+
throw new UnsupportedOperationException(VMInspectionOptions.getHeapDumpNotSupportedMessage());
239+
}
236240
VMRuntime.dumpHeap(outputFile, live);
237241
}
238242
}

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/heap/HeapDumpFeature.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import org.graalvm.collections.EconomicMap;
3333
import org.graalvm.collections.MapCursor;
3434
import org.graalvm.nativeimage.ImageSingletons;
35-
import org.graalvm.nativeimage.Platform;
3635
import org.graalvm.nativeimage.hosted.Feature;
3736
import org.graalvm.nativeimage.impl.HeapDumpSupport;
3837

@@ -69,18 +68,18 @@ public class HeapDumpFeature implements InternalFeature {
6968
@Override
7069
public boolean isInConfiguration(IsInConfigurationAccess access) {
7170
/*
72-
* Include the feature unconditionally (all platforms except Windows - even unknown
73-
* platforms). The code and all its data are only present in the final image if the heap
74-
* dumping infrastructure is actually called by any code (e.g., VMRuntime.dumpHeap(...) or
75-
* --enable-monitoring=heapdump).
71+
* Include the feature unconditionally (all platforms, even unknown platforms). The static
72+
* analysis ensures that the code and all its data are only present in the final image if
73+
* the heap dumping infrastructure is actually called by any code (e.g.,
74+
* VMRuntime.dumpHeap(...) or --enable-monitoring=heapdump).
7675
*/
77-
return !Platform.includedIn(Platform.WINDOWS.class);
76+
return true;
7877
}
7978

8079
@Override
8180
public void duringSetup(DuringSetupAccess access) {
8281
HeapDumpMetadata metadata = new HeapDumpMetadata();
83-
HeapDumping heapDumpSupport = new HeapDumpSupportImpl(metadata);
82+
HeapDumpSupportImpl heapDumpSupport = new HeapDumpSupportImpl(metadata);
8483

8584
ImageSingletons.add(HeapDumpSupport.class, heapDumpSupport);
8685
ImageSingletons.add(HeapDumping.class, heapDumpSupport);

0 commit comments

Comments
 (0)