< prev index next >

test/hotspot/jtreg/runtime/cds/appcds/javaldr/GCDuringDumpTransformer.java

Print this page

*** 1,7 **** /* ! * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 23,53 **** */ import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.lang.instrument.IllegalClassFormatException; import java.security.ProtectionDomain; public class GCDuringDumpTransformer implements ClassFileTransformer { public byte[] transform(ClassLoader loader, String name, Class<?> classBeingRedefined, ProtectionDomain pd, byte[] buffer) throws IllegalClassFormatException { try { makeGarbage(); } catch (Throwable t) { t.printStackTrace(); try { Thread.sleep(200); // let GC to have a chance to run } catch (Throwable t2) {} } return null; } private static Instrumentation savedInstrumentation; public static void premain(String agentArguments, Instrumentation instrumentation) { ! System.out.println("ClassFileTransformer.premain() is called"); instrumentation.addTransformer(new GCDuringDumpTransformer(), /*canRetransform=*/true); savedInstrumentation = instrumentation; } public static Instrumentation getInstrumentation() { --- 23,75 ---- */ import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.lang.instrument.IllegalClassFormatException; + import java.lang.ref.Cleaner; import java.security.ProtectionDomain; public class GCDuringDumpTransformer implements ClassFileTransformer { + static boolean TEST_WITH_CLEANER = Boolean.getBoolean("test.with.cleaner"); + static Cleaner cleaner; + static Thread thread; + static Object garbage; + + static { + if (TEST_WITH_CLEANER) { + cleaner = Cleaner.create(); + garbage = new Object(); + cleaner.register(garbage, new MyCleaner()); + System.out.println("Registered cleaner"); + } + } + public byte[] transform(ClassLoader loader, String name, Class<?> classBeingRedefined, ProtectionDomain pd, byte[] buffer) throws IllegalClassFormatException { + if (TEST_WITH_CLEANER) { + if (name.equals("Hello")) { + garbage = null; + System.out.println("Unreferenced GCDuringDumpTransformer.garbage"); + } + } else { try { makeGarbage(); } catch (Throwable t) { t.printStackTrace(); try { Thread.sleep(200); // let GC to have a chance to run } catch (Throwable t2) {} } + } return null; } private static Instrumentation savedInstrumentation; public static void premain(String agentArguments, Instrumentation instrumentation) { ! System.out.println("ClassFileTransformer.premain() is called: TEST_WITH_CLEANER = " + TEST_WITH_CLEANER); instrumentation.addTransformer(new GCDuringDumpTransformer(), /*canRetransform=*/true); savedInstrumentation = instrumentation; } public static Instrumentation getInstrumentation() {
*** 61,66 **** --- 83,99 ---- public static void makeGarbage() { for (int x=0; x<10; x++) { Object[] a = new Object[10000]; } } + + static class MyCleaner implements Runnable { + static int count = 0; + int i = count++; + public void run() { + // Allocate something. This will cause G1 to allocate an EDEN region. + // See JDK-8245925 + Object o = new Object(); + System.out.println("cleaning " + i); + } + } }
< prev index next >