Mercurial > hg > truffle
comparison test/gc/g1/TestHumongousShrinkHeap.java @ 20461:9b8bd21b6823
8056237: [TESTBUG] gc/g1/TestHumongousShrinkHeap.java fails due to OOM
Summary: Added respect for available memory. Renamed function names
Reviewed-by: jwilhelm, tschatzl
Contributed-by: andrey.x.zakharov@oracle.com
author | jwilhelm |
---|---|
date | Thu, 11 Sep 2014 14:21:24 +0200 |
parents | b1266b08b994 |
children | 7a6313074325 |
comparison
equal
deleted
inserted
replaced
20460:df66e3a3c4c2 | 20461:9b8bd21b6823 |
---|---|
24 /** | 24 /** |
25 * @test TestHumongousShrinkHeap | 25 * @test TestHumongousShrinkHeap |
26 * @bug 8036025 8056043 | 26 * @bug 8036025 8056043 |
27 * @summary Verify that heap shrinks after GC in the presence of fragmentation due to humongous objects | 27 * @summary Verify that heap shrinks after GC in the presence of fragmentation due to humongous objects |
28 * @library /testlibrary | 28 * @library /testlibrary |
29 * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=50 -XX:+UseG1GC -XX:G1HeapRegionSize=1M -verbose:gc TestHumongousShrinkHeap | 29 * @run main/othervm -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=12 -XX:+UseG1GC -XX:G1HeapRegionSize=1M -verbose:gc TestHumongousShrinkHeap |
30 */ | 30 */ |
31 | 31 |
32 import java.lang.management.ManagementFactory; | 32 import java.lang.management.ManagementFactory; |
33 import java.lang.management.MemoryUsage; | 33 import java.lang.management.MemoryUsage; |
34 import java.util.ArrayList; | 34 import java.util.ArrayList; |
39 public class TestHumongousShrinkHeap { | 39 public class TestHumongousShrinkHeap { |
40 | 40 |
41 public static final String MIN_FREE_RATIO_FLAG_NAME = "MinHeapFreeRatio"; | 41 public static final String MIN_FREE_RATIO_FLAG_NAME = "MinHeapFreeRatio"; |
42 public static final String MAX_FREE_RATIO_FLAG_NAME = "MaxHeapFreeRatio"; | 42 public static final String MAX_FREE_RATIO_FLAG_NAME = "MaxHeapFreeRatio"; |
43 | 43 |
44 private static final ArrayList<ArrayList<byte[]>> garbage = new ArrayList<>(); | 44 private static final List<List<byte[]>> garbage = new ArrayList(); |
45 private static final int PAGE_SIZE = 1024 * 1024; // 1M | 45 private static final int REGION_SIZE = 1024 * 1024; // 1M |
46 private static final int PAGES_NUM = 5; | 46 private static final int LISTS_COUNT = 10; |
47 private static final int HUMON_SIZE = Math.round(.9f * REGION_SIZE); | |
48 private static final long AVAILABLE_MEMORY | |
49 = Runtime.getRuntime().freeMemory(); | |
50 private static final int HUMON_COUNT | |
51 = (int) ((AVAILABLE_MEMORY / HUMON_SIZE) | |
52 / LISTS_COUNT); | |
47 | 53 |
48 | 54 |
49 public static void main(String[] args) { | 55 public static void main(String[] args) { |
56 System.out.format("Running with %s max heap size. " | |
57 + "Will allocate humongous object of %s size %d times.%n", | |
58 MemoryUsagePrinter.humanReadableByteCount(AVAILABLE_MEMORY, false), | |
59 MemoryUsagePrinter.humanReadableByteCount(HUMON_SIZE, false), | |
60 HUMON_COUNT | |
61 ); | |
50 new TestHumongousShrinkHeap().test(); | 62 new TestHumongousShrinkHeap().test(); |
51 } | 63 } |
52 | 64 |
53 private final void test() { | 65 private final void test() { |
54 System.gc(); | 66 System.gc(); |
55 MemoryUsagePrinter.printMemoryUsage("init"); | 67 MemoryUsagePrinter.printMemoryUsage("init"); |
56 | 68 |
57 eat(); | 69 allocate(); |
58 MemoryUsagePrinter.printMemoryUsage("eaten"); | 70 MemoryUsagePrinter.printMemoryUsage("allocated"); |
59 MemoryUsage muFull = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); | 71 MemoryUsage muFull = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); |
60 | 72 |
61 free(); | 73 free(); |
62 MemoryUsagePrinter.printMemoryUsage("free"); | 74 MemoryUsagePrinter.printMemoryUsage("free"); |
63 MemoryUsage muFree = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); | 75 MemoryUsage muFree = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); |
70 MAX_FREE_RATIO_FLAG_NAME, | 82 MAX_FREE_RATIO_FLAG_NAME, |
71 ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue() | 83 ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue() |
72 )); | 84 )); |
73 } | 85 } |
74 | 86 |
75 private void eat() { | 87 private void allocate() { |
76 int HumongousObjectSize = Math.round(.9f * PAGE_SIZE); | |
77 System.out.println("Will allocate objects of size=" + | |
78 MemoryUsagePrinter.humanReadableByteCount(HumongousObjectSize, true)); | |
79 | 88 |
80 for (int i = 0; i < PAGES_NUM; i++) { | 89 for (int i = 0; i < LISTS_COUNT; i++) { |
81 ArrayList<byte[]> stuff = new ArrayList<>(); | 90 List<byte[]> stuff = new ArrayList(); |
82 eatList(stuff, 100, HumongousObjectSize); | 91 allocateList(stuff, HUMON_COUNT, HUMON_SIZE); |
83 MemoryUsagePrinter.printMemoryUsage("eat #" + i); | 92 MemoryUsagePrinter.printMemoryUsage("allocate #" + (i+1)); |
84 garbage.add(stuff); | 93 garbage.add(stuff); |
85 } | 94 } |
86 } | 95 } |
87 | 96 |
88 private void free() { | 97 private void free() { |
89 // do not free last one list | 98 // do not free last one list |
90 garbage.subList(0, garbage.size() - 1).clear(); | 99 garbage.subList(0, garbage.size() - 1).clear(); |
91 | 100 |
92 // do not free last one element from last list | 101 // do not free last one element from last list |
93 ArrayList stuff = garbage.get(garbage.size() - 1); | 102 List stuff = garbage.get(garbage.size() - 1); |
94 stuff.subList(0, stuff.size() - 1).clear(); | 103 stuff.subList(0, stuff.size() - 1).clear(); |
95 System.gc(); | 104 System.gc(); |
96 } | 105 } |
97 | 106 |
98 private static void eatList(List garbage, int count, int size) { | 107 private static void allocateList(List garbage, int count, int size) { |
99 for (int i = 0; i < count; i++) { | 108 for (int i = 0; i < count; i++) { |
100 garbage.add(new byte[size]); | 109 garbage.add(new byte[size]); |
101 } | 110 } |
102 } | 111 } |
103 } | 112 } |
120 public static void printMemoryUsage(String label) { | 129 public static void printMemoryUsage(String label) { |
121 MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); | 130 MemoryUsage memusage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); |
122 float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); | 131 float freeratio = 1f - (float) memusage.getUsed() / memusage.getCommitted(); |
123 System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", | 132 System.out.format("[%-24s] init: %-7s, used: %-7s, comm: %-7s, freeRatio ~= %.1f%%%n", |
124 label, | 133 label, |
125 humanReadableByteCount(memusage.getInit(), true), | 134 humanReadableByteCount(memusage.getInit(), false), |
126 humanReadableByteCount(memusage.getUsed(), true), | 135 humanReadableByteCount(memusage.getUsed(), false), |
127 humanReadableByteCount(memusage.getCommitted(), true), | 136 humanReadableByteCount(memusage.getCommitted(), false), |
128 freeratio * 100 | 137 freeratio * 100 |
129 ); | 138 ); |
130 } | 139 } |
131 } | 140 } |