test/hotspot/jtreg/runtime/NMT/VirtualAllocCommitMerge.java
changeset 49033 3acc342c0738
equal deleted inserted replaced
49032:c1353f585fc3 49033:3acc342c0738
       
     1 /*
       
     2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 /*
       
    25  * @test
       
    26  * @summary Test merging of committed virtual memory and that we track it correctly
       
    27  * @key nmt jcmd
       
    28  * @library /test/lib
       
    29  * @modules java.base/jdk.internal.misc
       
    30  *          java.management
       
    31  * @build sun.hotspot.WhiteBox
       
    32  * @run main ClassFileInstaller sun.hotspot.WhiteBox
       
    33  * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:NativeMemoryTracking=detail VirtualAllocCommitMerge
       
    34  *
       
    35  */
       
    36 
       
    37 import jdk.test.lib.process.ProcessTools;
       
    38 import jdk.test.lib.process.OutputAnalyzer;
       
    39 import jdk.test.lib.JDKToolFinder;
       
    40 
       
    41 import sun.hotspot.WhiteBox;
       
    42 
       
    43 public class VirtualAllocCommitMerge {
       
    44 
       
    45     public static WhiteBox wb = WhiteBox.getWhiteBox();
       
    46 
       
    47     public static void main(String args[]) throws Exception {
       
    48         OutputAnalyzer output;
       
    49         long commitSize = 128 * 1024; // 128KB
       
    50         long reserveSize = 4 * 1024 * 1024; // 4096KB
       
    51         long addr;
       
    52 
       
    53         String pid = Long.toString(ProcessTools.getProcessId());
       
    54         ProcessBuilder pb = new ProcessBuilder();
       
    55 
       
    56         // reserve
       
    57         addr = wb.NMTReserveMemory(reserveSize);
       
    58         pb.command(new String[] { JDKToolFinder.getJDKTool("jcmd"), pid,
       
    59                 "VM.native_memory", "detail" });
       
    60 
       
    61         output = new OutputAnalyzer(pb.start());
       
    62         checkReservedCommittedSummary(output, "4096KB", "0KB");
       
    63         checkReserved(output, addr, reserveSize, "4096KB");
       
    64 
       
    65         long addrA = addr + (0 * commitSize);
       
    66         long addrB = addr + (1 * commitSize);
       
    67         long addrC = addr + (2 * commitSize);
       
    68         long addrD = addr + (3 * commitSize);
       
    69         long addrE = addr + (4 * commitSize);
       
    70 
       
    71         {
       
    72             // commit overlapping ABC, A, B, C
       
    73             wb.NMTCommitMemory(addrA, 3 * commitSize);
       
    74 
       
    75             output = new OutputAnalyzer(pb.start());
       
    76             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
    77             checkReserved(output, addr, reserveSize, "4096KB");
       
    78 
       
    79             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
    80 
       
    81 
       
    82             wb.NMTCommitMemory(addrA, commitSize);
       
    83 
       
    84             output = new OutputAnalyzer(pb.start());
       
    85             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
    86             checkReserved(output, addr, reserveSize, "4096KB");
       
    87 
       
    88             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
    89 
       
    90 
       
    91             wb.NMTCommitMemory(addrB, commitSize);
       
    92 
       
    93             output = new OutputAnalyzer(pb.start());
       
    94             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
    95             checkReserved(output, addr, reserveSize, "4096KB");
       
    96 
       
    97             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
    98 
       
    99             wb.NMTCommitMemory(addrC, commitSize);
       
   100 
       
   101             output = new OutputAnalyzer(pb.start());
       
   102             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   103             checkReserved(output, addr, reserveSize, "4096KB");
       
   104 
       
   105             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   106 
       
   107             // uncommit
       
   108             wb.NMTUncommitMemory(addrA, 3 * commitSize);
       
   109 
       
   110             output = new OutputAnalyzer(pb.start());
       
   111             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   112         }
       
   113 
       
   114         // Test discontigous areas
       
   115         {
       
   116             // commit ACE
       
   117             wb.NMTCommitMemory(addrA, commitSize);
       
   118             wb.NMTCommitMemory(addrC, commitSize);
       
   119             wb.NMTCommitMemory(addrE, commitSize);
       
   120 
       
   121             output = new OutputAnalyzer(pb.start());
       
   122             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   123             checkReserved(output, addr, reserveSize, "4096KB");
       
   124 
       
   125             checkCommitted(output, addrA, commitSize, "128KB");
       
   126             checkCommitted(output, addrC, commitSize, "128KB");
       
   127             checkCommitted(output, addrE, commitSize, "128KB");
       
   128 
       
   129             // uncommit ACE
       
   130             wb.NMTUncommitMemory(addrA, commitSize);
       
   131             wb.NMTUncommitMemory(addrC, commitSize);
       
   132             wb.NMTUncommitMemory(addrE, commitSize);
       
   133 
       
   134             output = new OutputAnalyzer(pb.start());
       
   135             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   136         }
       
   137 
       
   138         // Test contiguous areas
       
   139         {
       
   140             // commit AB
       
   141             wb.NMTCommitMemory(addrA, commitSize);
       
   142             wb.NMTCommitMemory(addrB, commitSize);
       
   143 
       
   144             output = new OutputAnalyzer(pb.start());
       
   145             checkReservedCommittedSummary(output, "4096KB", "256KB");
       
   146             checkReserved(output, addr, reserveSize, "4096KB");
       
   147 
       
   148             checkCommitted(output, addrA, 2 * commitSize, "256KB");
       
   149 
       
   150             // uncommit AB
       
   151             wb.NMTUncommitMemory(addrA, commitSize);
       
   152             wb.NMTUncommitMemory(addrB, commitSize);
       
   153 
       
   154             output = new OutputAnalyzer(pb.start());
       
   155             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   156         }
       
   157 
       
   158         {
       
   159             // commit BA
       
   160             wb.NMTCommitMemory(addrB, commitSize);
       
   161             wb.NMTCommitMemory(addrA, commitSize);
       
   162 
       
   163             output = new OutputAnalyzer(pb.start());
       
   164             checkReservedCommittedSummary(output, "4096KB", "256KB");
       
   165             checkReserved(output, addr, reserveSize, "4096KB");
       
   166 
       
   167             checkCommitted(output, addrA, 2 * commitSize, "256KB");
       
   168 
       
   169             // uncommit AB
       
   170             wb.NMTUncommitMemory(addrB, commitSize);
       
   171             wb.NMTUncommitMemory(addrA, commitSize);
       
   172 
       
   173             output = new OutputAnalyzer(pb.start());
       
   174             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   175         }
       
   176 
       
   177         {
       
   178             // commit ABC
       
   179             wb.NMTCommitMemory(addrA, commitSize);
       
   180             wb.NMTCommitMemory(addrB, commitSize);
       
   181             wb.NMTCommitMemory(addrC, commitSize);
       
   182 
       
   183             output = new OutputAnalyzer(pb.start());
       
   184             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   185             checkReserved(output, addr, reserveSize, "4096KB");
       
   186 
       
   187             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   188 
       
   189             // uncommit
       
   190             wb.NMTUncommitMemory(addrA, commitSize);
       
   191             wb.NMTUncommitMemory(addrB, commitSize);
       
   192             wb.NMTUncommitMemory(addrC, commitSize);
       
   193 
       
   194             output = new OutputAnalyzer(pb.start());
       
   195             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   196         }
       
   197 
       
   198         {
       
   199             // commit ACB
       
   200             wb.NMTCommitMemory(addrA, commitSize);
       
   201             wb.NMTCommitMemory(addrC, commitSize);
       
   202             wb.NMTCommitMemory(addrB, commitSize);
       
   203 
       
   204             output = new OutputAnalyzer(pb.start());
       
   205             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   206             checkReserved(output, addr, reserveSize, "4096KB");
       
   207 
       
   208             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   209 
       
   210             // uncommit
       
   211             wb.NMTUncommitMemory(addrA, commitSize);
       
   212             wb.NMTUncommitMemory(addrC, commitSize);
       
   213             wb.NMTUncommitMemory(addrB, commitSize);
       
   214 
       
   215             output = new OutputAnalyzer(pb.start());
       
   216             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   217         }
       
   218 
       
   219         {
       
   220             // commit BAC
       
   221             wb.NMTCommitMemory(addrB, commitSize);
       
   222             wb.NMTCommitMemory(addrA, commitSize);
       
   223             wb.NMTCommitMemory(addrC, commitSize);
       
   224 
       
   225             output = new OutputAnalyzer(pb.start());
       
   226             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   227             checkReserved(output, addr, reserveSize, "4096KB");
       
   228 
       
   229             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   230 
       
   231             // uncommit
       
   232             wb.NMTUncommitMemory(addrB, commitSize);
       
   233             wb.NMTUncommitMemory(addrA, commitSize);
       
   234             wb.NMTUncommitMemory(addrC, commitSize);
       
   235 
       
   236             output = new OutputAnalyzer(pb.start());
       
   237             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   238         }
       
   239 
       
   240         {
       
   241             // commit BCA
       
   242             wb.NMTCommitMemory(addrB, commitSize);
       
   243             wb.NMTCommitMemory(addrC, commitSize);
       
   244             wb.NMTCommitMemory(addrA, commitSize);
       
   245 
       
   246             output = new OutputAnalyzer(pb.start());
       
   247             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   248             checkReserved(output, addr, reserveSize, "4096KB");
       
   249 
       
   250             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   251 
       
   252             // uncommit
       
   253             wb.NMTUncommitMemory(addrB, commitSize);
       
   254             wb.NMTUncommitMemory(addrC, commitSize);
       
   255             wb.NMTUncommitMemory(addrA, commitSize);
       
   256 
       
   257             output = new OutputAnalyzer(pb.start());
       
   258             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   259         }
       
   260 
       
   261         {
       
   262             // commit CAB
       
   263             wb.NMTCommitMemory(addrC, commitSize);
       
   264             wb.NMTCommitMemory(addrA, commitSize);
       
   265             wb.NMTCommitMemory(addrB, commitSize);
       
   266 
       
   267             output = new OutputAnalyzer(pb.start());
       
   268             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   269             checkReserved(output, addr, reserveSize, "4096KB");
       
   270 
       
   271             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   272 
       
   273             // uncommit
       
   274             wb.NMTUncommitMemory(addrC, commitSize);
       
   275             wb.NMTUncommitMemory(addrA, commitSize);
       
   276             wb.NMTUncommitMemory(addrB, commitSize);
       
   277 
       
   278             output = new OutputAnalyzer(pb.start());
       
   279             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   280         }
       
   281 
       
   282         {
       
   283             // commit CBA
       
   284             wb.NMTCommitMemory(addrC, commitSize);
       
   285             wb.NMTCommitMemory(addrB, commitSize);
       
   286             wb.NMTCommitMemory(addrA, commitSize);
       
   287 
       
   288             output = new OutputAnalyzer(pb.start());
       
   289             checkReservedCommittedSummary(output, "4096KB", "384KB");
       
   290             checkReserved(output, addr, reserveSize, "4096KB");
       
   291 
       
   292             checkCommitted(output, addrA, 3 * commitSize, "384KB");
       
   293 
       
   294             // uncommit
       
   295             wb.NMTUncommitMemory(addrC, commitSize);
       
   296             wb.NMTUncommitMemory(addrB, commitSize);
       
   297             wb.NMTUncommitMemory(addrA, commitSize);
       
   298 
       
   299             output = new OutputAnalyzer(pb.start());
       
   300             checkReservedCommittedSummary(output, "4096KB", "0KB");
       
   301         }
       
   302 
       
   303         // release
       
   304         wb.NMTReleaseMemory(addr, reserveSize);
       
   305         output = new OutputAnalyzer(pb.start());
       
   306         output.shouldNotContain("Test (reserved=");
       
   307         output.shouldNotMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*"
       
   308                 + Long.toHexString(addr + reserveSize) + "\\] reserved 4096KB for Test");
       
   309     }
       
   310 
       
   311     public static void checkReservedCommittedSummary(OutputAnalyzer output, String reservedString, String committedString) {
       
   312         output.shouldContain("Test (reserved=" + reservedString + ", committed=" + committedString + ")");
       
   313     }
       
   314 
       
   315     public static void checkReserved(OutputAnalyzer output, long addr, long size, String sizeString) {
       
   316         output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*"
       
   317                            + Long.toHexString(addr + size)
       
   318                            + "\\] reserved 4096KB for Test");
       
   319     }
       
   320 
       
   321     public static void checkCommitted(OutputAnalyzer output, long addr, long size, String sizeString) {
       
   322         output.shouldMatch("\\[0x[0]*" + Long.toHexString(addr) + " - 0x[0]*"
       
   323                            + Long.toHexString(addr + size)
       
   324                            + "\\] committed " + sizeString + " from.*");
       
   325     }
       
   326 }