Path: blob/master/test/hotspot/jtreg/runtime/Metaspace/FragmentMetaspace.java
40942 views
/*1* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @library /test/lib26* @modules java.base/jdk.internal.misc27* @modules java.compiler28* @run main/othervm/timeout=200 -Xmx1g FragmentMetaspace29*/3031import java.io.IOException;32import jdk.test.lib.classloader.GeneratingCompilingClassLoader;3334/**35* Test that tries to fragment the native memory used by class loaders.36* This test creates class loaders that load classes of increasing size for every37* iteration. By increasing the size of the class meta data needed for every iteration38* we stress the subsystem for allocating native memory for meta data.39*/40public class FragmentMetaspace {4142public static Class<?> c;4344public static void main(String... args) {45runGrowing(Long.valueOf(System.getProperty("time", "40000")),46Integer.valueOf(System.getProperty("iterations", "100")));47// try to clean up and unload classes to decrease48// class verification time in debug vm49System.gc();50}5152private static void runGrowing(long time, int iterations) {53long startTime = System.currentTimeMillis();54for (int i = 0; System.currentTimeMillis() < startTime + time && i < iterations; ++i) {55try {56GeneratingCompilingClassLoader gcl = new GeneratingCompilingClassLoader();5758// getGeneratedClasses throws a RuntimeException in cases where59// the javac exit code is not 0. If the original reason for the exception is60// a "java.lang.OutOfMemoryError: Java heap space",61// increase the heap size in the @run tag and rerun the test.62// The heap can be exhausted by this test, but heap exhaustion63// is not a failure mode of this test and should be ignored.64c = gcl.getGeneratedClasses(i, 100)[0];65c.newInstance();66c = null;6768gcl = null;69} catch (IOException | InstantiationException | IllegalAccessException ex) {70throw new RuntimeException(ex);71} catch (OutOfMemoryError oome) {72System.out.println("javac failed with OOM; ignored.");73return;74}75}76}77}787980