Skip to content

Commit 3ba8023

Browse files
Refactorings and fixes.
1 parent b448875 commit 3ba8023

File tree

13 files changed

+160
-163
lines changed

13 files changed

+160
-163
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapChunkProvider.java

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
*/
2525
package com.oracle.svm.core.genscavenge;
2626

27-
import com.oracle.svm.core.VMInspectionOptions;
2827
import org.graalvm.nativeimage.Platform;
2928
import org.graalvm.nativeimage.Platforms;
3029
import org.graalvm.word.Pointer;
@@ -41,8 +40,6 @@
4140
import com.oracle.svm.core.jdk.UninterruptibleUtils;
4241
import com.oracle.svm.core.jdk.UninterruptibleUtils.AtomicUnsigned;
4342
import com.oracle.svm.core.log.Log;
44-
import com.oracle.svm.core.nmt.NmtCategory;
45-
import com.oracle.svm.core.nmt.NativeMemoryTracking;
4643
import com.oracle.svm.core.os.ChunkBasedCommittedMemoryProvider;
4744
import com.oracle.svm.core.thread.VMOperation;
4845
import com.oracle.svm.core.thread.VMThreads;
@@ -96,10 +93,7 @@ AlignedHeader produceAlignedChunk() {
9693
if (result.isNull()) {
9794
throw OutOfMemoryUtil.reportOutOfMemoryError(ALIGNED_OUT_OF_MEMORY_ERROR);
9895
}
99-
if (VMInspectionOptions.hasNativeMemoryTrackingSupport()) {
100-
NativeMemoryTracking.singleton().trackReserve(chunkSize.rawValue(), NmtCategory.JavaHeap);
101-
NativeMemoryTracking.singleton().trackCommit(chunkSize.rawValue(), NmtCategory.JavaHeap);
102-
}
96+
10397
AlignedHeapChunk.initialize(result, chunkSize);
10498
}
10599
assert HeapChunk.getTopOffset(result).equal(AlignedHeapChunk.getObjectsStartOffset());
@@ -250,10 +244,7 @@ UnalignedHeader produceUnalignedChunk(UnsignedWord objectSize) {
250244
if (result.isNull()) {
251245
throw OutOfMemoryUtil.reportOutOfMemoryError(UNALIGNED_OUT_OF_MEMORY_ERROR);
252246
}
253-
if (VMInspectionOptions.hasNativeMemoryTrackingSupport()) {
254-
NativeMemoryTracking.singleton().trackReserve(chunkSize.rawValue(), NmtCategory.JavaHeap);
255-
NativeMemoryTracking.singleton().trackCommit(chunkSize.rawValue(), NmtCategory.JavaHeap);
256-
}
247+
257248
UnalignedHeapChunk.initialize(result, chunkSize);
258249
assert objectSize.belowOrEqual(HeapChunk.availableObjectMemory(result)) : "UnalignedHeapChunk insufficient for requested object";
259250

@@ -315,22 +306,12 @@ static void freeUnalignedChunkList(UnalignedHeader first) {
315306

316307
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
317308
private static void freeAlignedChunk(AlignedHeader chunk) {
318-
UnsignedWord size = HeapParameters.getAlignedHeapChunkSize();
319-
ChunkBasedCommittedMemoryProvider.get().freeAlignedChunk(chunk, size, HeapParameters.getAlignedHeapChunkAlignment());
320-
if (VMInspectionOptions.hasNativeMemoryTrackingSupport()) {
321-
NativeMemoryTracking.singleton().trackUncommit(size.rawValue(), NmtCategory.JavaHeap);
322-
NativeMemoryTracking.singleton().trackFree(size.rawValue(), NmtCategory.JavaHeap);
323-
}
309+
ChunkBasedCommittedMemoryProvider.get().freeAlignedChunk(chunk, HeapParameters.getAlignedHeapChunkSize(), HeapParameters.getAlignedHeapChunkAlignment());
324310
}
325311

326312
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
327313
private static void freeUnalignedChunk(UnalignedHeader chunk) {
328-
UnsignedWord size = unalignedChunkSize(chunk);
329-
ChunkBasedCommittedMemoryProvider.get().freeUnalignedChunk(chunk, size);
330-
if (VMInspectionOptions.hasNativeMemoryTrackingSupport()) {
331-
NativeMemoryTracking.singleton().trackUncommit(size.rawValue(), NmtCategory.JavaHeap);
332-
NativeMemoryTracking.singleton().trackFree(size.rawValue(), NmtCategory.JavaHeap);
333-
}
314+
ChunkBasedCommittedMemoryProvider.get().freeUnalignedChunk(chunk, unalignedChunkSize(chunk));
334315
}
335316

336317
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/HeapImpl.java

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import com.oracle.svm.core.nodes.CFunctionEpilogueNode;
7676
import com.oracle.svm.core.nodes.CFunctionPrologueNode;
7777
import com.oracle.svm.core.option.RuntimeOptionKey;
78+
import com.oracle.svm.core.os.ImageHeapProvider;
7879
import com.oracle.svm.core.snippets.KnownIntrinsics;
7980
import com.oracle.svm.core.thread.PlatformThreads;
8081
import com.oracle.svm.core.thread.ThreadStatus;
@@ -115,8 +116,6 @@ public final class HeapImpl extends Heap {
115116
/** Total number of times when threads waiting for a pending reference list were interrupted. */
116117
private volatile long refListWaiterWakeUpCounter;
117118

118-
private volatile long imageHeapSize = -1;
119-
120119
/** Head of the linked list of object pins. */
121120
private final AtomicReference<PinnedObjectImpl> pinHead = new AtomicReference<>();
122121

@@ -463,6 +462,17 @@ public static boolean isImageHeapAligned() {
463462
return SubstrateOptions.SpawnIsolates.getValue();
464463
}
465464

465+
@Override
466+
public UnsignedWord getImageHeapReservedBytes() {
467+
return ImageHeapProvider.get().getImageHeapAddressSpaceSize();
468+
}
469+
470+
@Override
471+
public UnsignedWord getImageHeapCommittedBytes() {
472+
int imageHeapOffset = HeapImpl.getHeapImpl().getImageHeapOffsetInAddressSpace();
473+
return ImageHeapProvider.get().getImageHeapAddressSpaceSize().subtract(imageHeapOffset);
474+
}
475+
466476
@Override
467477
public boolean walkImageHeapObjects(ObjectVisitor visitor) {
468478
VMOperation.guaranteeInProgressAtSafepoint("Must only be called at a safepoint");
@@ -477,28 +487,6 @@ public boolean walkImageHeapObjects(ObjectVisitor visitor) {
477487
return !AuxiliaryImageHeap.isPresent() || AuxiliaryImageHeap.singleton().walkObjects(visitor);
478488
}
479489

480-
@Override
481-
public long getImageHeapSize() {
482-
ImageHeapSizeVisitor visitor = new ImageHeapSizeVisitor();
483-
if (imageHeapSize == -1) {
484-
for (ImageHeapInfo info = firstImageHeapInfo; info != null; info = info.next) {
485-
ImageHeapWalker.walkRegions(info, visitor);
486-
}
487-
imageHeapSize = visitor.size;
488-
}
489-
return imageHeapSize;
490-
}
491-
492-
private static class ImageHeapSizeVisitor implements MemoryWalker.ImageHeapRegionVisitor {
493-
long size;
494-
495-
@Override
496-
public <T> boolean visitNativeImageHeapRegion(T region, MemoryWalker.NativeImageHeapRegionAccess<T> access) {
497-
size += access.getSize(region).rawValue();
498-
return true;
499-
}
500-
}
501-
502490
@Override
503491
public boolean walkCollectedHeapObjects(ObjectVisitor visitor) {
504492
VMOperation.guaranteeInProgressAtSafepoint("Must only be called at a safepoint");

substratevm/src/com.oracle.svm.core.posix/src/com/oracle/svm/core/posix/linux/LinuxImageHeapProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,11 @@ private static UnsignedWord getLayeredImageHeapAddressSpaceSize() {
147147

148148
@Override
149149
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
150-
protected UnsignedWord getImageHeapAddressSpaceSize() {
150+
public UnsignedWord getImageHeapAddressSpaceSize() {
151151
if (ImageLayerBuildingSupport.buildingImageLayer()) {
152152
return getLayeredImageHeapAddressSpaceSize();
153-
} else {
154-
return super.getImageHeapAddressSpaceSize();
155153
}
154+
return super.getImageHeapAddressSpaceSize();
156155
}
157156

158157
@Uninterruptible(reason = "Called during isolate initialization.")

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/heap/Heap.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,6 @@ protected Heap() {
9696
*/
9797
public abstract boolean walkImageHeapObjects(ObjectVisitor visitor);
9898

99-
public abstract long getImageHeapSize();
100-
10199
/**
102100
* Walk all heap objects except the native image heap objects. Must only be executed as part of
103101
* a VM operation that causes a safepoint.
@@ -233,6 +231,10 @@ public Pointer getImageHeapStart() {
233231
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
234232
public abstract UnsignedWord getUsedMemoryAfterLastGC();
235233

234+
public abstract UnsignedWord getImageHeapReservedBytes();
235+
236+
public abstract UnsignedWord getImageHeapCommittedBytes();
237+
236238
/** Consider all references in the given object as needing remembered set entries. */
237239
@Uninterruptible(reason = "Ensure that no GC can occur between modification of the object and this call.", callerMustBe = true)
238240
public abstract void dirtyAllReferencesOf(Object obj);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jfr/events/EveryChunkNativePeriodicEvents.java

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ private static void emitNmtPeakEvents() {
125125
NativeMemoryUsageTotalPeakEvent nmtTotalPeakEvent = new NativeMemoryUsageTotalPeakEvent();
126126

127127
long totalPeakMalloc = NativeMemoryTracking.singleton().getPeakTotalMallocMemory();
128-
long totalPeakCommitted = NativeMemoryTracking.singleton().getPeakTotalCommittedVirtualMemory();
129-
long totalPeakReserved = NativeMemoryTracking.singleton().getPeakTotalReservedVirtualMemory();
128+
long totalPeakCommittedVM = NativeMemoryTracking.singleton().getPeakTotalCommittedVirtualMemory();
129+
long totalPeakReservedVM = NativeMemoryTracking.singleton().getPeakTotalReservedVirtualMemory();
130130

131-
nmtTotalPeakEvent.peakCommitted = totalPeakCommitted + totalPeakMalloc;
132-
nmtTotalPeakEvent.peakReserved = totalPeakReserved + totalPeakMalloc;
131+
nmtTotalPeakEvent.peakCommitted = totalPeakCommittedVM + totalPeakMalloc;
132+
nmtTotalPeakEvent.peakReserved = totalPeakReservedVM + totalPeakMalloc;
133133
nmtTotalPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtPeakTotalMallocMemory();
134134
nmtTotalPeakEvent.commit();
135135

@@ -138,26 +138,33 @@ private static void emitNmtPeakEvents() {
138138
nmtPeakEvent.type = nmtCategory.getName();
139139

140140
long peakMalloc = NativeMemoryTracking.singleton().getPeakMallocMemory(nmtCategory);
141-
long peakCommitted = NativeMemoryTracking.singleton().getPeakCommittedVirtualMemory(nmtCategory);
142-
long peakReserved = NativeMemoryTracking.singleton().getPeakReservedVirtualMemory(nmtCategory);
143-
nmtPeakEvent.peakCommitted = peakCommitted + peakMalloc;
144-
nmtPeakEvent.peakReserved = peakReserved + peakMalloc;
141+
long peakCommittedVM = NativeMemoryTracking.singleton().getPeakCommittedVirtualMemory(nmtCategory);
142+
long peakReservedVM = NativeMemoryTracking.singleton().getPeakReservedVirtualMemory(nmtCategory);
143+
nmtPeakEvent.peakCommitted = peakCommittedVM + peakMalloc;
144+
nmtPeakEvent.peakReserved = peakReservedVM + peakMalloc;
145145
nmtPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtPeakMallocMemory(nmtCategory);
146146
nmtPeakEvent.commit();
147147
}
148148
}
149149

150150
@Uninterruptible(reason = "Accesses a JFR buffer.")
151151
private static void emitJdkNmtEvents(NmtCategory[] nmtCategories) {
152-
long timestamp = JfrTicks.elapsedTicks();
152+
boolean emitNativeMemoryUsageEvent = JfrEvent.NativeMemoryUsage.shouldEmit();
153+
boolean emitNativeMemoryUsageTotalEvent = JfrEvent.NativeMemoryUsageTotal.shouldEmit();
154+
if (!emitNativeMemoryUsageEvent && !emitNativeMemoryUsageTotalEvent) {
155+
return;
156+
}
157+
153158
JfrNativeEventWriterData data = StackValue.get(JfrNativeEventWriterData.class);
154159
JfrNativeEventWriterDataAccess.initializeThreadLocalNativeBuffer(data);
160+
long timestamp = JfrTicks.elapsedTicks();
155161

156-
if (JfrEvent.NativeMemoryUsage.shouldEmit()) {
162+
if (emitNativeMemoryUsageEvent) {
157163
for (NmtCategory nmtCategory : nmtCategories) {
158-
long mallocMemory = NativeMemoryTracking.singleton().getMallocMemory(nmtCategory);
159-
long committedVM = NativeMemoryTracking.singleton().getCommittedVirtualMemory(nmtCategory);
160-
long reservedVM = NativeMemoryTracking.singleton().getReservedVirtualMemory(nmtCategory);
164+
NativeMemoryTracking nmt = NativeMemoryTracking.singleton();
165+
long mallocMemory = nmt.getMallocMemory(nmtCategory);
166+
long committedVM = nmt.getCommittedVirtualMemory(nmtCategory);
167+
long reservedVM = nmt.getReservedVirtualMemory(nmtCategory);
161168

162169
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.NativeMemoryUsage);
163170
JfrNativeEventWriter.putLong(data, timestamp);
@@ -168,10 +175,12 @@ private static void emitJdkNmtEvents(NmtCategory[] nmtCategories) {
168175
}
169176
}
170177

171-
if (JfrEvent.NativeMemoryUsageTotal.shouldEmit()) {
172-
long totalMallocMemory = NativeMemoryTracking.singleton().getTotalMallocMemory();
173-
long totalCommittedVM = NativeMemoryTracking.singleton().getTotalCommittedVirtualMemory();
174-
long totalReservedVM = NativeMemoryTracking.singleton().getTotalReservedVirtualMemory();
178+
if (emitNativeMemoryUsageTotalEvent) {
179+
NativeMemoryTracking nmt = NativeMemoryTracking.singleton();
180+
long totalMallocMemory = nmt.getTotalMallocMemory();
181+
long totalCommittedVM = nmt.getTotalCommittedVirtualMemory();
182+
long totalReservedVM = nmt.getTotalReservedVirtualMemory();
183+
175184
JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.NativeMemoryUsageTotal);
176185
JfrNativeEventWriter.putLong(data, timestamp);
177186
JfrNativeEventWriter.putLong(data, totalMallocMemory + totalReservedVM);

0 commit comments

Comments
 (0)