1
1
/*
2
- * Copyright (c) 2017, 2019 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 2017, 2020 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
25
25
import java .lang .instrument .ClassFileTransformer ;
26
26
import java .lang .instrument .Instrumentation ;
27
27
import java .lang .instrument .IllegalClassFormatException ;
28
+ import java .lang .ref .Cleaner ;
28
29
import java .security .ProtectionDomain ;
29
30
30
31
public class GCDuringDumpTransformer implements ClassFileTransformer {
32
+ static boolean TEST_WITH_CLEANER = Boolean .getBoolean ("test.with.cleaner" );
33
+ static Cleaner cleaner ;
34
+ static Thread thread ;
35
+ static Object garbage ;
36
+
37
+ static {
38
+ if (TEST_WITH_CLEANER ) {
39
+ cleaner = Cleaner .create ();
40
+ garbage = new Object ();
41
+ cleaner .register (garbage , new MyCleaner ());
42
+ System .out .println ("Registered cleaner" );
43
+ }
44
+ }
45
+
31
46
public byte [] transform (ClassLoader loader , String name , Class <?> classBeingRedefined ,
32
47
ProtectionDomain pd , byte [] buffer ) throws IllegalClassFormatException {
33
- try {
34
- makeGarbage ();
35
- } catch (Throwable t ) {
36
- t .printStackTrace ();
48
+ if (TEST_WITH_CLEANER ) {
49
+ if (name .equals ("Hello" )) {
50
+ garbage = null ;
51
+ System .out .println ("Unreferenced GCDuringDumpTransformer.garbage" );
52
+ }
53
+ } else {
37
54
try {
38
- Thread .sleep (200 ); // let GC to have a chance to run
39
- } catch (Throwable t2 ) {}
55
+ makeGarbage ();
56
+ } catch (Throwable t ) {
57
+ t .printStackTrace ();
58
+ try {
59
+ Thread .sleep (200 ); // let GC to have a chance to run
60
+ } catch (Throwable t2 ) {}
61
+ }
40
62
}
41
63
42
64
return null ;
@@ -45,7 +67,7 @@ public byte[] transform(ClassLoader loader, String name, Class<?> classBeingRede
45
67
private static Instrumentation savedInstrumentation ;
46
68
47
69
public static void premain (String agentArguments , Instrumentation instrumentation ) {
48
- System .out .println ("ClassFileTransformer.premain() is called" );
70
+ System .out .println ("ClassFileTransformer.premain() is called: TEST_WITH_CLEANER = " + TEST_WITH_CLEANER );
49
71
instrumentation .addTransformer (new GCDuringDumpTransformer (), /*canRetransform=*/ true );
50
72
savedInstrumentation = instrumentation ;
51
73
}
@@ -63,4 +85,15 @@ public static void makeGarbage() {
63
85
Object [] a = new Object [10000 ];
64
86
}
65
87
}
88
+
89
+ static class MyCleaner implements Runnable {
90
+ static int count = 0 ;
91
+ int i = count ++;
92
+ public void run () {
93
+ // Allocate something. This will cause G1 to allocate an EDEN region.
94
+ // See JDK-8245925
95
+ Object o = new Object ();
96
+ System .out .println ("cleaning " + i );
97
+ }
98
+ }
66
99
}
0 commit comments