1 /* 2 * Copyright (c) 2009, 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 * @key stress gc 27 * 28 * @summary converted from VM Testbase gc/gctests/FinalizeTest05. 29 * VM Testbase keywords: [gc, stress, stressopt, nonconcurrent] 30 * 31 * @library /vmTestbase 32 * /test/lib 33 * @run driver jdk.test.lib.FileInstaller . . 34 * @run main/othervm -XX:-UseGCOverheadLimit gc.gctests.FinalizeTest05.FinalizeTest05 35 */ 36 37 package gc.gctests.FinalizeTest05; 38 39 import nsk.share.gc.*; 40 import java.util.*; 41 import nsk.share.TestFailure; 42 import nsk.share.test.ExecutionController; 43 import nsk.share.test.Stresser; 44 45 /** 46 */ 47 public class FinalizeTest05 extends GCTestBase { 48 49 private final int allocRatio = 5; 50 private final int size = 1024 * 2; 51 private int count = 1000; 52 private ExecutionController stresser; 53 54 private void runOne() { 55 ArrayList objs = new ArrayList(count); 56 Object o; 57 for (int i = 0; i < count; i++) { 58 if (i % allocRatio == 0) { 59 o = new FinMemoryObject(size); 60 objs.add(o); 61 } else { 62 o = new byte[size - Memory.getObjectExtraSize()]; 63 } 64 } 65 FinMemoryObject.dumpStatistics(); 66 o = null; 67 68 /* force finalization */ 69 Algorithms.eatMemory(stresser); 70 System.gc(); 71 Runtime.getRuntime().runFinalization(); 72 System.gc(); 73 Runtime.getRuntime().runFinalization(); 74 75 FinMemoryObject.dumpStatistics(); 76 77 boolean error; 78 System.out.println("Allocated: " + FinMemoryObject.getAllocatedCount()); 79 System.out.println("Finalized: " + FinMemoryObject.getFinalizedCount()); 80 error = (FinMemoryObject.getFinalizedCount() != 0); 81 82 // Just hit the objs array to do say VM that we use this object 83 // and it should be alive in this point. 84 objs.clear(); 85 if (error) { 86 throw new TestFailure("Test failed."); 87 } 88 } 89 90 public void run() { 91 stresser = new Stresser(runParams.getStressOptions()); 92 stresser.start(runParams.getIterations()); 93 count = (int) Math.min(runParams.getTestMemory() / size, Integer.MAX_VALUE); 94 System.out.println("Allocating " + count 95 + " objects. 1 out of " + allocRatio 96 + " will have a finalizer."); 97 System.out.flush(); 98 runOne(); 99 } 100 101 public static void main(String[] args) { 102 GC.runTest(new FinalizeTest05(), args); 103 } 104 }