Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
import com.oracle.svm.core.nodes.CFunctionEpilogueNode;
import com.oracle.svm.core.nodes.CFunctionPrologueNode;
import com.oracle.svm.core.option.RuntimeOptionKey;
import com.oracle.svm.core.os.ImageHeapProvider;
import com.oracle.svm.core.snippets.KnownIntrinsics;
import com.oracle.svm.core.thread.PlatformThreads;
import com.oracle.svm.core.thread.ThreadStatus;
Expand Down Expand Up @@ -461,6 +462,17 @@ public static boolean isImageHeapAligned() {
return SubstrateOptions.SpawnIsolates.getValue();
}

@Override
public UnsignedWord getImageHeapReservedBytes() {
return ImageHeapProvider.get().getImageHeapAddressSpaceSize();
}

@Override
public UnsignedWord getImageHeapCommittedBytes() {
int imageHeapOffset = HeapImpl.getHeapImpl().getImageHeapOffsetInAddressSpace();
return ImageHeapProvider.get().getImageHeapAddressSpaceSize().subtract(imageHeapOffset);
}

@Override
public boolean walkImageHeapObjects(ObjectVisitor visitor) {
VMOperation.guaranteeInProgressAtSafepoint("Must only be called at a safepoint");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,11 @@ private static UnsignedWord getLayeredImageHeapAddressSpaceSize() {

@Override
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
protected UnsignedWord getImageHeapAddressSpaceSize() {
public UnsignedWord getImageHeapAddressSpaceSize() {
if (ImageLayerBuildingSupport.buildingImageLayer()) {
return getLayeredImageHeapAddressSpaceSize();
} else {
return super.getImageHeapAddressSpaceSize();
}
return super.getImageHeapAddressSpaceSize();
}

@Uninterruptible(reason = "Called during isolate initialization.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,10 @@ public Pointer getImageHeapStart() {
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
public abstract UnsignedWord getUsedMemoryAfterLastGC();

public abstract UnsignedWord getImageHeapReservedBytes();

public abstract UnsignedWord getImageHeapCommittedBytes();

/** Consider all references in the given object as needing remembered set entries. */
@Uninterruptible(reason = "Ensure that no GC can occur between modification of the object and this call.", callerMustBe = true)
public abstract void dirtyAllReferencesOf(Object obj);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,50 +124,67 @@ private static void emitNativeMemoryTrackingEvents() {
private static void emitNmtPeakEvents() {
NativeMemoryUsageTotalPeakEvent nmtTotalPeakEvent = new NativeMemoryUsageTotalPeakEvent();

long totalPeakUsed = NativeMemoryTracking.singleton().getPeakTotalUsedMemory();
nmtTotalPeakEvent.peakCommitted = totalPeakUsed;
nmtTotalPeakEvent.peakReserved = totalPeakUsed;
nmtTotalPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtTotalPeakUsage();
long totalPeakMalloc = NativeMemoryTracking.singleton().getPeakTotalMallocMemory();
long totalPeakCommittedVM = NativeMemoryTracking.singleton().getPeakTotalCommittedVirtualMemory();
long totalPeakReservedVM = NativeMemoryTracking.singleton().getPeakTotalReservedVirtualMemory();

nmtTotalPeakEvent.peakCommitted = totalPeakCommittedVM + totalPeakMalloc;
nmtTotalPeakEvent.peakReserved = totalPeakReservedVM + totalPeakMalloc;
nmtTotalPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtPeakTotalMallocMemory();
nmtTotalPeakEvent.commit();

for (NmtCategory nmtCategory : NmtCategory.values()) {
NativeMemoryUsagePeakEvent nmtPeakEvent = new NativeMemoryUsagePeakEvent();
nmtPeakEvent.type = nmtCategory.getName();

long peakUsed = NativeMemoryTracking.singleton().getPeakUsedMemory(nmtCategory);
nmtPeakEvent.peakCommitted = peakUsed;
nmtPeakEvent.peakReserved = peakUsed;
nmtPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtPeakUsage(nmtCategory);
long peakMalloc = NativeMemoryTracking.singleton().getPeakMallocMemory(nmtCategory);
long peakCommittedVM = NativeMemoryTracking.singleton().getPeakCommittedVirtualMemory(nmtCategory);
long peakReservedVM = NativeMemoryTracking.singleton().getPeakReservedVirtualMemory(nmtCategory);
nmtPeakEvent.peakCommitted = peakCommittedVM + peakMalloc;
nmtPeakEvent.peakReserved = peakReservedVM + peakMalloc;
nmtPeakEvent.countAtPeak = NativeMemoryTracking.singleton().getCountAtPeakMallocMemory(nmtCategory);
nmtPeakEvent.commit();
}
}

@Uninterruptible(reason = "Accesses a JFR buffer.")
private static void emitJdkNmtEvents(NmtCategory[] nmtCategories) {
long timestamp = JfrTicks.elapsedTicks();
boolean emitNativeMemoryUsageEvent = JfrEvent.NativeMemoryUsage.shouldEmit();
boolean emitNativeMemoryUsageTotalEvent = JfrEvent.NativeMemoryUsageTotal.shouldEmit();
if (!emitNativeMemoryUsageEvent && !emitNativeMemoryUsageTotalEvent) {
return;
}

JfrNativeEventWriterData data = StackValue.get(JfrNativeEventWriterData.class);
JfrNativeEventWriterDataAccess.initializeThreadLocalNativeBuffer(data);
long timestamp = JfrTicks.elapsedTicks();

if (JfrEvent.NativeMemoryUsage.shouldEmit()) {
if (emitNativeMemoryUsageEvent) {
for (NmtCategory nmtCategory : nmtCategories) {
long usedMemory = NativeMemoryTracking.singleton().getUsedMemory(nmtCategory);
NativeMemoryTracking nmt = NativeMemoryTracking.singleton();
long mallocMemory = nmt.getMallocMemory(nmtCategory);
long committedVM = nmt.getCommittedVirtualMemory(nmtCategory);
long reservedVM = nmt.getReservedVirtualMemory(nmtCategory);

JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.NativeMemoryUsage);
JfrNativeEventWriter.putLong(data, timestamp);
JfrNativeEventWriter.putLong(data, nmtCategory.ordinal());
JfrNativeEventWriter.putLong(data, usedMemory); // reserved
JfrNativeEventWriter.putLong(data, usedMemory); // committed
JfrNativeEventWriter.putLong(data, mallocMemory + reservedVM);
JfrNativeEventWriter.putLong(data, mallocMemory + committedVM);
JfrNativeEventWriter.endSmallEvent(data);
}
}

if (JfrEvent.NativeMemoryUsageTotal.shouldEmit()) {
long totalUsedMemory = NativeMemoryTracking.singleton().getTotalUsedMemory();
if (emitNativeMemoryUsageTotalEvent) {
NativeMemoryTracking nmt = NativeMemoryTracking.singleton();
long totalMallocMemory = nmt.getTotalMallocMemory();
long totalCommittedVM = nmt.getTotalCommittedVirtualMemory();
long totalReservedVM = nmt.getTotalReservedVirtualMemory();

JfrNativeEventWriter.beginSmallEvent(data, JfrEvent.NativeMemoryUsageTotal);
JfrNativeEventWriter.putLong(data, timestamp);
JfrNativeEventWriter.putLong(data, totalUsedMemory); // reserved
JfrNativeEventWriter.putLong(data, totalUsedMemory); // committed
JfrNativeEventWriter.putLong(data, totalMallocMemory + totalReservedVM);
JfrNativeEventWriter.putLong(data, totalMallocMemory + totalCommittedVM);
JfrNativeEventWriter.endSmallEvent(data);
}
}
Expand Down
Loading