private static void testDynamicNumberOfGCThreads(String gcFlag) throws Exception {
    // UseDynamicNumberOfGCThreads and TraceDynamicGCThreads enabled
    String[] baseArgs = {
      "-XX:+" + gcFlag,
      "-Xmx10M",
      "-XX:+UseDynamicNumberOfGCThreads",
      "-Xlog:gc+task=trace",
      GCTest.class.getName()
    };

    // Base test with gc and +UseDynamicNumberOfGCThreads:
    ProcessBuilder pb_enabled = ProcessTools.createJavaProcessBuilder(baseArgs);
    verifyDynamicNumberOfGCThreads(new OutputAnalyzer(pb_enabled.start()));

    // Ensure it also works on uniprocessors or if user specifies -XX:ParallelGCThreads=1:
    String[] extraArgs = {
      "-XX:+UnlockDiagnosticVMOptions",
      "-XX:+ForceDynamicNumberOfGCThreads",
      "-XX:ParallelGCThreads=1"
    };
    String[] finalArgs = new String[baseArgs.length + extraArgs.length];
    System.arraycopy(extraArgs, 0, finalArgs, 0, extraArgs.length);
    System.arraycopy(baseArgs, 0, finalArgs, extraArgs.length, baseArgs.length);
    pb_enabled = ProcessTools.createJavaProcessBuilder(finalArgs);
    verifyDynamicNumberOfGCThreads(new OutputAnalyzer(pb_enabled.start()));

    // Turn on parallel reference processing
    String[] parRefProcArg = {"-XX:+ParallelRefProcEnabled", "-XX:-ShowMessageBoxOnError"};
    String[] parRefArgs = new String[baseArgs.length + parRefProcArg.length];
    System.arraycopy(parRefProcArg, 0, parRefArgs, 0, parRefProcArg.length);
    System.arraycopy(baseArgs, 0, parRefArgs, parRefProcArg.length, baseArgs.length);
    pb_enabled = ProcessTools.createJavaProcessBuilder(parRefArgs);
    verifyDynamicNumberOfGCThreads(new OutputAnalyzer(pb_enabled.start()));
  }
Пример #2
0
 private void test() {
   for (TestCaseData testCase : TestCaseData.values()) {
     System.out.println(testCase);
     OutputAnalyzer oa;
     try {
       oa =
           ProcessTools.executeTestJvmAllArgs(
               "-XX:+UnlockExperimentalVMOptions",
               "-XX:+EnableJVMCI",
               "-Xbootclasspath/a:.",
               DebugOutputTest.Worker.class.getName(),
               testCase.name());
     } catch (Throwable e) {
       e.printStackTrace();
       throw new Error("Problems running child process", e);
     }
     if (testCase.expectedException != null) {
       oa.shouldHaveExitValue(1);
       oa.shouldContain(testCase.expectedException.getName());
     } else {
       oa.shouldHaveExitValue(0);
       oa.shouldContain(new String(testCase.getExpected()));
     }
   }
 }
Пример #3
0
  /** Compile two module definitions used by the test, jdk.test and jdk.translet. */
  public static void main(String[] args) throws Exception {

    boolean compiled;
    // Compile module jdk.test declaration
    compiled = CompilerUtils.compile(SRC_DIR.resolve("jdk.test"), MODS_DIR.resolve("jdk.test"));
    if (!compiled) {
      throw new RuntimeException("Test failed to compile module jdk.test");
    }

    // Compile module jdk.translet declaration
    compiled =
        CompilerUtils.compile(
            SRC_DIR.resolve("jdk.translet"),
            MODS_DIR.resolve("jdk.translet"),
            "--add-exports=jdk.test/test=jdk.translet",
            "-p",
            MODS_DIR.toString());
    if (!compiled) {
      throw new RuntimeException("Test failed to compile module jdk.translet");
    }

    // Sanity check that the test, jdk.test/test/MainGC.java,
    // correctly walks module jdk.test's reads list and package
    // test's, defined to module jdk.translet, export list at
    // GC safepoints.
    ProcessBuilder pb =
        ProcessTools.createJavaProcessBuilder(
            "-Xlog:modules=trace", "-p", MODS_DIR.toString(), "-m", "jdk.test/test.MainGC");
    OutputAnalyzer oa = new OutputAnalyzer(pb.start());
    oa.shouldContain("package test defined in module jdk.test, exports list being walked")
        .shouldContain("module jdk.test reads list being walked")
        .shouldHaveExitValue(0);
  }
Пример #4
0
  /** Check the result of segmented code cache related VM options. */
  public static void main(String[] args) throws Exception {
    ProcessBuilder pb;

    // Disabled with ReservedCodeCacheSize < 240MB
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:ReservedCodeCacheSize=239m", "-XX:+PrintCodeCache", "-version");
    verifySegmentedCodeCache(pb, false);

    // Disabled without TieredCompilation
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:-TieredCompilation", "-XX:+PrintCodeCache", "-version");
    verifySegmentedCodeCache(pb, false);

    // Enabled with TieredCompilation and ReservedCodeCacheSize >= 240MB
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+TieredCompilation",
            "-XX:ReservedCodeCacheSize=240m",
            "-XX:+PrintCodeCache",
            "-version");
    verifySegmentedCodeCache(pb, true);
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+TieredCompilation",
            "-XX:ReservedCodeCacheSize=400m",
            "-XX:+PrintCodeCache",
            "-version");
    verifySegmentedCodeCache(pb, true);

    // Always enabled if SegmentedCodeCache is set
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache",
            "-XX:-TieredCompilation",
            "-XX:ReservedCodeCacheSize=239m",
            "-XX:+PrintCodeCache",
            "-version");
    verifySegmentedCodeCache(pb, true);

    // The profiled and non-profiled code heaps should not be available in
    // interpreter-only mode
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache", "-Xint", "-XX:+PrintCodeCache", "-version");
    verifyCodeHeapNotExists(pb, PROFILED, NON_PROFILED);

    // If we stop compilation at CompLevel_none or CompLevel_simple we
    // don't need a profiled code heap.
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache",
            "-XX:TieredStopAtLevel=0",
            "-XX:+PrintCodeCache",
            "-version");
    verifyCodeHeapNotExists(pb, PROFILED);
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache",
            "-XX:TieredStopAtLevel=1",
            "-XX:+PrintCodeCache",
            "-version");
    verifyCodeHeapNotExists(pb, PROFILED);

    // Fails with too small non-nmethod code heap size
    pb = ProcessTools.createJavaProcessBuilder("-XX:NonNMethodCodeHeapSize=100K");
    failsWith(pb, "Invalid NonNMethodCodeHeapSize");

    // Fails if code heap sizes do not add up
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache",
            "-XX:ReservedCodeCacheSize=10M",
            "-XX:NonNMethodCodeHeapSize=5M",
            "-XX:ProfiledCodeHeapSize=5M",
            "-XX:NonProfiledCodeHeapSize=5M");
    failsWith(pb, "Invalid code heap sizes");

    // Fails if not enough space for VM internal code
    long minUseSpace = WHITE_BOX.getUintxVMFlag("CodeCacheMinimumUseSpace");
    // minimum size: CodeCacheMinimumUseSpace DEBUG_ONLY(* 3)
    long minSize = (Platform.isDebugBuild() ? 3 : 1) * minUseSpace;
    pb =
        ProcessTools.createJavaProcessBuilder(
            "-XX:+SegmentedCodeCache",
            "-XX:ReservedCodeCacheSize=" + minSize,
            "-XX:InitialCodeCacheSize=100K");
    failsWith(pb, "Not enough space in non-nmethod code heap to run VM");
  }
Пример #5
0
 public static void runTest(String test, String result) throws Throwable {
   ProcessBuilder pb =
       ProcessTools.createJavaProcessBuilder("-cp", testsrc + File.separator + "test.jar", test);
   OutputAnalyzer output = new OutputAnalyzer(pb.start());
   output.shouldContain("java.lang.ClassFormatError: Multiple " + result);
 }
Пример #6
0
  public static void main(String args[]) throws Exception {
    is_64_bit_system = (Platform.is64bit());

    OutputAnalyzer output;
    whiteBox = WhiteBox.getWhiteBox();

    // Grab my own PID
    String pid = Long.toString(ProcessTools.getProcessId());
    ProcessBuilder pb = new ProcessBuilder();

    AllocThread[] alloc_threads = new AllocThread[256];
    ReleaseThread[] release_threads = new ReleaseThread[64];

    int index;
    // Create many allocation threads
    for (index = 0; index < alloc_threads.length; index++) {
      alloc_threads[index] = new AllocThread();
    }

    // Fewer release threads
    for (index = 0; index < release_threads.length; index++) {
      release_threads[index] = new ReleaseThread();
    }

    if (is_64_bit_system()) {
      sleep_wait(2 * 60 * 1000);
    } else {
      sleep_wait(60 * 1000);
    }
    // pause the stress test
    phase = TestPhase.pause;
    while (pause_count.intValue() < alloc_threads.length + release_threads.length) {
      sleep_wait(10);
    }

    long mallocd_total_in_KB = (mallocd_total + K / 2) / K;

    // Now check if the result from NMT matches the total memory allocated.
    String expected_test_summary =
        "Test (reserved=" + mallocd_total_in_KB + "KB, committed=" + mallocd_total_in_KB + "KB)";
    // Run 'jcmd <pid> VM.native_memory summary'
    pb.command(new String[] {JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "summary"});
    output = new OutputAnalyzer(pb.start());
    output.shouldContain(expected_test_summary);

    // Release all allocated memory
    phase = TestPhase.release;
    synchronized (mallocd_memory) {
      mallocd_memory.notifyAll();
    }

    // Join all threads
    for (index = 0; index < alloc_threads.length; index++) {
      try {
        alloc_threads[index].join();
      } catch (InterruptedException e) {
      }
    }

    for (index = 0; index < release_threads.length; index++) {
      try {
        release_threads[index].join();
      } catch (InterruptedException e) {
      }
    }

    // All test memory allocated should be released
    output = new OutputAnalyzer(pb.start());
    output.shouldNotContain("Test (reserved=");

    // Verify that tracking level has not been downgraded
    pb.command(
        new String[] {JDKToolFinder.getJDKTool("jcmd"), pid, "VM.native_memory", "statistics"});
    output = new OutputAnalyzer(pb.start());
    output.shouldNotContain("Tracking level has been downgraded due to lack of resources");
  }