jdk/test/java/lang/ref/OOMEInReferenceHandler.java
author jmasa
Tue, 20 Jan 2015 13:29:26 -0800
changeset 28673 4dbf48487f1f
parent 18792 dbac92e2a5e8
child 29528 d1a052f7ccef
permissions -rw-r--r--
8067751: OOMEInReferenceHandler.java fails: Cleaner terminated abnormally Summary: OOME with message "GC overhead limit exceeded". -XX:-UseGCOverheadLimit was added to avoid OOME in resource handler. Reviewed-by: jmasa, jwilhelm Contributed-by: michail.chernov@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17716
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     1
/*
28673
4dbf48487f1f 8067751: OOMEInReferenceHandler.java fails: Cleaner terminated abnormally
jmasa
parents: 18792
diff changeset
     2
 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
17716
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     4
 *
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     7
 * published by the Free Software Foundation.
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     8
 *
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    13
 * accompanied this code).
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    14
 *
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    18
 *
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    21
 * questions.
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    22
 */
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    23
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    24
/**
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    25
 * @test
18792
dbac92e2a5e8 8016341: java/lang/ref/OOMEInReferenceHandler.java failing intermittently
dholmes
parents: 17716
diff changeset
    26
 * @bug 7038914 8016341
17716
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    27
 * @summary Verify that the reference handler does not die after an OOME allocating the InterruptedException object
28673
4dbf48487f1f 8067751: OOMEInReferenceHandler.java fails: Cleaner terminated abnormally
jmasa
parents: 18792
diff changeset
    28
 * @run main/othervm -XX:-UseGCOverheadLimit -Xmx24M -XX:-UseTLAB OOMEInReferenceHandler
17716
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    29
 * @author peter.levart@gmail.com
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    30
 */
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    31
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    32
import java.lang.ref.*;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    33
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    34
public class OOMEInReferenceHandler {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    35
     static Object[] fillHeap() {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    36
         Object[] first = null, last = null;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    37
         int size = 1 << 20;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    38
         while (size > 0) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    39
             try {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    40
                 Object[] array = new Object[size];
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    41
                 if (first == null) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    42
                     first = array;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    43
                 } else {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    44
                     last[0] = array;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    45
                 }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    46
                 last = array;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    47
             } catch (OutOfMemoryError oome) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    48
                 size = size >>> 1;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    49
             }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    50
         }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    51
         return first;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    52
     }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    53
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    54
     public static void main(String[] args) throws Exception {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    55
         // preinitialize the InterruptedException class so that the reference handler
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    56
         // does not die due to OOME when loading the class if it is the first use
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    57
         InterruptedException ie = new InterruptedException("dummy");
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    58
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    59
         ThreadGroup tg = Thread.currentThread().getThreadGroup();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    60
         for (
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    61
             ThreadGroup tgn = tg;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    62
             tgn != null;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    63
             tg = tgn, tgn = tg.getParent()
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    64
             )
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    65
             ;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    66
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    67
         Thread[] threads = new Thread[tg.activeCount()];
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    68
         Thread referenceHandlerThread = null;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    69
         int n = tg.enumerate(threads);
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    70
         for (int i = 0; i < n; i++) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    71
             if ("Reference Handler".equals(threads[i].getName())) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    72
                 referenceHandlerThread = threads[i];
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    73
             }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    74
         }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    75
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    76
         if (referenceHandlerThread == null) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    77
             throw new IllegalStateException("Couldn't find Reference Handler thread.");
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    78
         }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    79
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    80
         ReferenceQueue<Object> refQueue = new ReferenceQueue<>();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    81
         Object referent = new Object();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    82
         WeakReference<Object> weakRef = new WeakReference<>(referent, refQueue);
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    83
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    84
         Object waste = fillHeap();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    85
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    86
         referenceHandlerThread.interrupt();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    87
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    88
         // allow referenceHandlerThread some time to throw OOME
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    89
         Thread.sleep(500L);
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    90
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    91
         // release waste & referent
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    92
         waste = null;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    93
         referent = null;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    94
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    95
         // wait at most 10 seconds for success or failure
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    96
         for (int i = 0; i < 20; i++) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    97
             if (refQueue.poll() != null) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    98
                 // Reference Handler thread still working -> success
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
    99
                 return;
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   100
             }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   101
             System.gc();
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   102
             Thread.sleep(500L); // wait a little to allow GC to do it's work before allocating objects
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   103
             if (!referenceHandlerThread.isAlive()) {
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   104
                 // Reference Handler thread died -> failure
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   105
                 throw new Exception("Reference Handler thread died.");
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   106
             }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   107
         }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   108
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   109
         // no sure answer after 10 seconds
18792
dbac92e2a5e8 8016341: java/lang/ref/OOMEInReferenceHandler.java failing intermittently
dholmes
parents: 17716
diff changeset
   110
         throw new IllegalStateException("Reference Handler thread stuck. weakRef.get(): " + weakRef.get());
17716
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   111
     }
f9486b530c80 7038914: VM could throw uncaught OOME in ReferenceHandler thread
plevart
parents:
diff changeset
   112
}