# HG changeset patch # User zgu # Date 1549661692 18000 # Node ID c3abd2b71b9a2892adf3f400bc89de038797afc1 # Parent 97d605522fcb55bdc2778724cd893055285fcf21 8200109: NMT: diff_malloc_site assert(early->flags() == current->flags(), "Must be the same memory type") Reviewed-by: shade, coleenp diff -r 97d605522fcb -r c3abd2b71b9a src/share/vm/prims/whitebox.cpp --- a/src/share/vm/prims/whitebox.cpp Mon Feb 25 21:38:45 2019 +0000 +++ b/src/share/vm/prims/whitebox.cpp Fri Feb 08 16:34:52 2019 -0500 @@ -371,6 +371,13 @@ return (jlong)(uintptr_t)os::malloc(size, mtTest, stack); WB_END +// Alloc memory with pseudo call stack and specific memory type. +WB_ENTRY(jlong, WB_NMTMallocWithPseudoStackAndType(JNIEnv* env, jobject o, jlong size, jint pseudo_stack, jint type)) + address pc = (address)(size_t)pseudo_stack; + NativeCallStack stack(&pc, 1); + return (jlong)(uintptr_t)os::malloc(size, (MEMFLAGS)type, stack); +WB_END + // Free the memory allocated by NMTAllocTest WB_ENTRY(void, WB_NMTFree(JNIEnv* env, jobject o, jlong mem)) os::free((void*)(uintptr_t)mem, mtTest); @@ -1081,6 +1088,7 @@ #if INCLUDE_NMT {CC"NMTMalloc", CC"(J)J", (void*)&WB_NMTMalloc }, {CC"NMTMallocWithPseudoStack", CC"(JI)J", (void*)&WB_NMTMallocWithPseudoStack}, + {CC"NMTMallocWithPseudoStackAndType", CC"(JII)J", (void*)&WB_NMTMallocWithPseudoStackAndType}, {CC"NMTFree", CC"(J)V", (void*)&WB_NMTFree }, {CC"NMTReserveMemory", CC"(J)J", (void*)&WB_NMTReserveMemory }, {CC"NMTCommitMemory", CC"(JJ)V", (void*)&WB_NMTCommitMemory }, diff -r 97d605522fcb -r c3abd2b71b9a src/share/vm/services/memReporter.cpp --- a/src/share/vm/services/memReporter.cpp Mon Feb 25 21:38:45 2019 +0000 +++ b/src/share/vm/services/memReporter.cpp Fri Feb 08 16:34:52 2019 -0500 @@ -572,9 +572,15 @@ void MemDetailDiffReporter::diff_malloc_site(const MallocSite* early, const MallocSite* current) const { - assert(early->flags() == current->flags(), "Must be the same memory type"); - diff_malloc_site(current->call_stack(), current->size(), current->count(), - early->size(), early->count(), early->flags()); + if (early->flags() != current->flags()) { + // If malloc site type changed, treat it as deallocation of old type and + // allocation of new type. + old_malloc_site(early); + new_malloc_site(current); + } else { + diff_malloc_site(current->call_stack(), current->size(), current->count(), + early->size(), early->count(), early->flags()); + } } void MemDetailDiffReporter::diff_malloc_site(const NativeCallStack* stack, size_t current_size, diff -r 97d605522fcb -r c3abd2b71b9a test/runtime/NMT/MallocSiteTypeChange.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/runtime/NMT/MallocSiteTypeChange.java Fri Feb 08 16:34:52 2019 -0500 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2019, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/* + * @test MallocSiteTypeChange + * @summary Test a malloc site type change results NMT to report deallocation of old type and allocation of new type + * @bug 8200109 + * @key nmt jcmd + * @modules java.base/jdk.internal.misc + * @library /testlibrary /testlibrary/whitebox + * @build sun.hotspot.WhiteBox + * @run driver ClassFileInstaller sun.hotspot.WhiteBox + * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail MallocSiteTypeChange + */ + +import com.oracle.java.testlibrary.*; +import sun.hotspot.WhiteBox; + +public class MallocSiteTypeChange { + public static void main(String args[]) throws Exception { + OutputAnalyzer output; + WhiteBox wb = WhiteBox.getWhiteBox(); + + // Grab my own PID + String pid = Long.toString(ProcessTools.getProcessId()); + ProcessBuilder pb = new ProcessBuilder(); + + int pc = 1; + long addr = wb.NMTMallocWithPseudoStack(4 * 1024, pc); + + // Verify that current tracking level is "detail" + pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "summary"}); + output = new OutputAnalyzer(pb.start()); + output.shouldContain("Test (reserved=4KB, committed=4KB)"); + + pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "baseline"}); + output = new OutputAnalyzer(pb.start()); + output.shouldContain("Baseline succeeded"); + + wb.NMTFree(addr); + addr = wb.NMTMallocWithPseudoStackAndType(2 * 1024, pc, 7 /* mtInternal */ ); + pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "detail.diff"}); + output = new OutputAnalyzer(pb.start()); + output.shouldContain("(malloc=0KB type=Test -4KB)"); + output.shouldContain("(malloc=2KB type=Internal +2KB #1 +1)"); + output.shouldHaveExitValue(0); + } +} diff -r 97d605522fcb -r c3abd2b71b9a test/testlibrary/whitebox/sun/hotspot/WhiteBox.java --- a/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Mon Feb 25 21:38:45 2019 +0000 +++ b/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java Fri Feb 08 16:34:52 2019 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -117,6 +117,7 @@ public native void NMTUncommitMemory(long addr, long size); public native void NMTReleaseMemory(long addr, long size); public native long NMTMallocWithPseudoStack(long size, int index); + public native long NMTMallocWithPseudoStackAndType(long size, int index, int type); public native boolean NMTIsDetailSupported(); public native boolean NMTChangeTrackingLevel(); public native int NMTGetHashSize();