Hi All, I'm testing the performance of Parallel, CMS, and G1. I found that their available heap sizes are different under the same -Xmx configuration.
For example, I set the -Xmx to 6.5GB (6656m) and use Runtime.getRuntime().maxMemory() to obtain the real heap size. The output is as follows. Running with: [-Xmx6656m, -XX:+UseParallelGC, -XX:+UseParallelOldGC] Runtime.getRuntime().maxMemory(): 6,058,496K, 5916.50MB, 5.78GB. memoryStore: 3.29GB. Running with: [-Xmx6656m, -XX:+UseConcMarkSweepGC] Runtime.getRuntime().maxMemory(): 6,747,648K, 6589.50MB, 6.44GB. memoryStore: 3.69GB. Running with: [-Xmx6656m, -XX:+UseG1GC] Runtime.getRuntime().maxMemory(): 6,815,744K, 6656.00MB, 6.50GB. memoryStore: 3.72GB. We can see that the available heap sizes are [Parallel: 5.78GB < CMS: 6.44GB < G1: 6.50GB]. My JDK version is java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode) Any suggestions will be appreciated. The test script is as follows. #!/bin/bash XMX=6656m java -Xmx$XMX -XX:+UseParallelGC -XX:+UseParallelOldGC HeapSizeDifferences java -Xmx$XMX -XX:+UseConcMarkSweepGC HeapSizeDifferences java -Xmx$XMX -XX:+UseG1GC HeapSizeDifferences The testing code is as follows. import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class HeapSizeDifferences { static Collection<Object> objects = new ArrayList<Object>(); static long lastMaxMemory = 0; public static void main(String[] args) { try { List<String> inputArguments = ManagementFactory.getRuntimeMXBean().getInputArguments(); System.out.println("Running with: " + inputArguments); while (true) { printMaxMemory(); consumeSpace(); } } catch (OutOfMemoryError e) { freeSpace(); printMaxMemory(); } } static void printMaxMemory() { long currentMaxMemory = Runtime.getRuntime().maxMemory(); if (currentMaxMemory != lastMaxMemory) { lastMaxMemory = currentMaxMemory; System.out.format("Runtime.getRuntime().maxMemory(): %,dK, %.2fMB, %.2fGB.%n", currentMaxMemory / 1024, (float) currentMaxMemory / 1024 / 1024, (float) currentMaxMemory / 1024 / 1024 / 1024); double memoryStore = (currentMaxMemory - 300 * 1024 * 1024) * 0.6; System.out.format("memoryStore: %.2fGB.%n", memoryStore / 1024 / 1024 / 1024); } } static void consumeSpace() { objects.add(new int[1_000_000]); } static void freeSpace() { objects.clear(); } }
_______________________________________________ hotspot-gc-use mailing list hotspot-gc-use@openjdk.java.net http://mail.openjdk.java.net/mailman/listinfo/hotspot-gc-use