1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/compiler/uncommontrap/TestDeoptOOM.java Tue Nov 25 17:33:59 2014 +0100 1.3 @@ -0,0 +1,426 @@ 1.4 +/* 1.5 + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 1.23 + * or visit www.oracle.com if you need additional information or have any 1.24 + * questions. 1.25 + */ 1.26 + 1.27 +/* 1.28 + * @test 1.29 + * @bug 6898462 1.30 + * @summary failed reallocations of scalar replaced objects during deoptimization causes crash 1.31 + * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=exclude,TestDeoptOOM::main -XX:CompileCommand=exclude,TestDeoptOOM::m9_1 -Xmx128M TestDeoptOOM 1.32 + * 1.33 + */ 1.34 + 1.35 +public class TestDeoptOOM { 1.36 + 1.37 + long f1; 1.38 + long f2; 1.39 + long f3; 1.40 + long f4; 1.41 + long f5; 1.42 + 1.43 + static class LinkedList { 1.44 + LinkedList l; 1.45 + long[] array; 1.46 + LinkedList(LinkedList l, int size) { 1.47 + array = new long[size]; 1.48 + this.l = l; 1.49 + } 1.50 + } 1.51 + 1.52 + static LinkedList ll; 1.53 + 1.54 + static void consume_all_memory() { 1.55 + int size = 128 * 1024 * 1024; 1.56 + while(size > 0) { 1.57 + try { 1.58 + while(true) { 1.59 + ll = new LinkedList(ll, size); 1.60 + } 1.61 + } catch(OutOfMemoryError oom) { 1.62 + } 1.63 + size = size / 2; 1.64 + } 1.65 + } 1.66 + 1.67 + static void free_memory() { 1.68 + ll = null; 1.69 + } 1.70 + 1.71 + static TestDeoptOOM m1(boolean deopt) { 1.72 + try { 1.73 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.74 + if (deopt) { 1.75 + return tdoom; 1.76 + } 1.77 + } catch(OutOfMemoryError oom) { 1.78 + free_memory(); 1.79 + System.out.println("OOM caught in m1"); 1.80 + } 1.81 + return null; 1.82 + } 1.83 + 1.84 + static TestDeoptOOM m2_1(boolean deopt) { 1.85 + try { 1.86 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.87 + if (deopt) { 1.88 + return tdoom; 1.89 + } 1.90 + } catch(OutOfMemoryError oom) { 1.91 + free_memory(); 1.92 + System.out.println("OOM caught in m2_1"); 1.93 + } 1.94 + return null; 1.95 + } 1.96 + 1.97 + static TestDeoptOOM m2(boolean deopt) { 1.98 + try { 1.99 + return m2_1(deopt); 1.100 + } catch(OutOfMemoryError oom) { 1.101 + free_memory(); 1.102 + System.out.println("OOM caught in m2"); 1.103 + } 1.104 + return null; 1.105 + } 1.106 + 1.107 + static TestDeoptOOM m3_3(boolean deopt) { 1.108 + try { 1.109 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.110 + if (deopt) { 1.111 + return tdoom; 1.112 + } 1.113 + } catch(OutOfMemoryError oom) { 1.114 + free_memory(); 1.115 + System.out.println("OOM caught in m3_3"); 1.116 + } 1.117 + return null; 1.118 + } 1.119 + 1.120 + static boolean m3_2(boolean deopt) { 1.121 + try { 1.122 + return m3_3(deopt) != null; 1.123 + } catch(OutOfMemoryError oom) { 1.124 + free_memory(); 1.125 + System.out.println("OOM caught in m3_2"); 1.126 + } 1.127 + return false; 1.128 + } 1.129 + 1.130 + static TestDeoptOOM m3_1(boolean deopt) { 1.131 + try { 1.132 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.133 + if (m3_2(deopt)) { 1.134 + return tdoom; 1.135 + } 1.136 + } catch(OutOfMemoryError oom) { 1.137 + free_memory(); 1.138 + System.out.println("OOM caught in m3_1"); 1.139 + } 1.140 + return null; 1.141 + } 1.142 + 1.143 + static TestDeoptOOM m3(boolean deopt) { 1.144 + try { 1.145 + return m3_1(deopt); 1.146 + } catch(OutOfMemoryError oom) { 1.147 + free_memory(); 1.148 + System.out.println("OOM caught in m3"); 1.149 + } 1.150 + return null; 1.151 + } 1.152 + 1.153 + static TestDeoptOOM m4(boolean deopt) { 1.154 + try { 1.155 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.156 + if (deopt) { 1.157 + tdoom.f1 = 1l; 1.158 + tdoom.f2 = 2l; 1.159 + tdoom.f3 = 3l; 1.160 + return tdoom; 1.161 + } 1.162 + } catch(OutOfMemoryError oom) { 1.163 + free_memory(); 1.164 + System.out.println("OOM caught in m4"); 1.165 + } 1.166 + return null; 1.167 + } 1.168 + 1.169 + static TestDeoptOOM m5(boolean deopt) { 1.170 + try { 1.171 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.172 + synchronized(tdoom) { 1.173 + if (deopt) { 1.174 + return tdoom; 1.175 + } 1.176 + } 1.177 + } catch(OutOfMemoryError oom) { 1.178 + free_memory(); 1.179 + System.out.println("OOM caught in m5"); 1.180 + } 1.181 + return null; 1.182 + } 1.183 + 1.184 + synchronized TestDeoptOOM m6_1(boolean deopt) { 1.185 + if (deopt) { 1.186 + return this; 1.187 + } 1.188 + return null; 1.189 + } 1.190 + 1.191 + static TestDeoptOOM m6(boolean deopt) { 1.192 + try { 1.193 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.194 + return tdoom.m6_1(deopt); 1.195 + } catch(OutOfMemoryError oom) { 1.196 + free_memory(); 1.197 + System.out.println("OOM caught in m6"); 1.198 + } 1.199 + return null; 1.200 + } 1.201 + 1.202 + static TestDeoptOOM m7_1(boolean deopt, Object lock) { 1.203 + try { 1.204 + synchronized(lock) { 1.205 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.206 + if (deopt) { 1.207 + return tdoom; 1.208 + } 1.209 + } 1.210 + } catch(OutOfMemoryError oom) { 1.211 + free_memory(); 1.212 + System.out.println("OOM caught in m7_1"); 1.213 + } 1.214 + return null; 1.215 + } 1.216 + 1.217 + static TestDeoptOOM m7(boolean deopt, Object lock) { 1.218 + try { 1.219 + return m7_1(deopt, lock); 1.220 + } catch(OutOfMemoryError oom) { 1.221 + free_memory(); 1.222 + System.out.println("OOM caught in m7"); 1.223 + } 1.224 + return null; 1.225 + } 1.226 + 1.227 + static class A { 1.228 + long f1; 1.229 + long f2; 1.230 + long f3; 1.231 + long f4; 1.232 + long f5; 1.233 + } 1.234 + 1.235 + static class B { 1.236 + long f1; 1.237 + long f2; 1.238 + long f3; 1.239 + long f4; 1.240 + long f5; 1.241 + 1.242 + A a; 1.243 + } 1.244 + 1.245 + static B m8(boolean deopt) { 1.246 + try { 1.247 + A a = new A(); 1.248 + B b = new B(); 1.249 + b.a = a; 1.250 + if (deopt) { 1.251 + return b; 1.252 + } 1.253 + } catch(OutOfMemoryError oom) { 1.254 + free_memory(); 1.255 + System.out.println("OOM caught in m8"); 1.256 + } 1.257 + return null; 1.258 + } 1.259 + 1.260 + static void m9_1(int i) { 1.261 + if (i > 90000) { 1.262 + consume_all_memory(); 1.263 + } 1.264 + } 1.265 + 1.266 + static TestDeoptOOM m9() { 1.267 + try { 1.268 + for (int i = 0; i < 100000; i++) { 1.269 + TestDeoptOOM tdoom = new TestDeoptOOM(); 1.270 + m9_1(i); 1.271 + if (i > 90000) { 1.272 + return tdoom; 1.273 + } 1.274 + } 1.275 + } catch(OutOfMemoryError oom) { 1.276 + free_memory(); 1.277 + System.out.println("OOM caught in m1"); 1.278 + } 1.279 + return null; 1.280 + } 1.281 + 1.282 + public static void main(String[] args) { 1.283 + for (int i = 0; i < 20000; i++) { 1.284 + m1(false); 1.285 + } 1.286 + 1.287 + consume_all_memory(); 1.288 + 1.289 + try { 1.290 + m1(true); 1.291 + } catch(OutOfMemoryError oom) { 1.292 + free_memory(); 1.293 + System.out.println("OOM caught in main " + oom.getMessage()); 1.294 + } 1.295 + 1.296 + free_memory(); 1.297 + 1.298 + for (int i = 0; i < 20000; i++) { 1.299 + m2(false); 1.300 + } 1.301 + 1.302 + consume_all_memory(); 1.303 + 1.304 + try { 1.305 + m2(true); 1.306 + } catch(OutOfMemoryError oom) { 1.307 + free_memory(); 1.308 + System.out.println("OOM caught in main"); 1.309 + } 1.310 + 1.311 + free_memory(); 1.312 + 1.313 + for (int i = 0; i < 20000; i++) { 1.314 + m3(false); 1.315 + } 1.316 + 1.317 + consume_all_memory(); 1.318 + 1.319 + try { 1.320 + m3(true); 1.321 + } catch(OutOfMemoryError oom) { 1.322 + free_memory(); 1.323 + System.out.println("OOM caught in main"); 1.324 + } 1.325 + 1.326 + free_memory(); 1.327 + 1.328 + for (int i = 0; i < 20000; i++) { 1.329 + m4(false); 1.330 + } 1.331 + 1.332 + consume_all_memory(); 1.333 + 1.334 + try { 1.335 + m4(true); 1.336 + } catch(OutOfMemoryError oom) { 1.337 + free_memory(); 1.338 + System.out.println("OOM caught in main"); 1.339 + } 1.340 + 1.341 + free_memory(); 1.342 + 1.343 + for (int i = 0; i < 20000; i++) { 1.344 + m5(false); 1.345 + } 1.346 + 1.347 + consume_all_memory(); 1.348 + 1.349 + try { 1.350 + m5(true); 1.351 + } catch(OutOfMemoryError oom) { 1.352 + free_memory(); 1.353 + System.out.println("OOM caught in main"); 1.354 + } 1.355 + 1.356 + free_memory(); 1.357 + 1.358 + for (int i = 0; i < 20000; i++) { 1.359 + m6(false); 1.360 + } 1.361 + 1.362 + consume_all_memory(); 1.363 + 1.364 + try { 1.365 + m6(true); 1.366 + } catch(OutOfMemoryError oom) { 1.367 + free_memory(); 1.368 + System.out.println("OOM caught in main"); 1.369 + } 1.370 + 1.371 + free_memory(); 1.372 + 1.373 + final Object lock = new Object(); 1.374 + 1.375 + for (int i = 0; i < 20000; i++) { 1.376 + m7(false, lock); 1.377 + } 1.378 + 1.379 + consume_all_memory(); 1.380 + 1.381 + try { 1.382 + m7(true, lock); 1.383 + } catch(OutOfMemoryError oom) { 1.384 + free_memory(); 1.385 + System.out.println("OOM caught in main"); 1.386 + } 1.387 + 1.388 + free_memory(); 1.389 + 1.390 + Thread thread = new Thread() { 1.391 + public void run() { 1.392 + System.out.println("Acquiring lock"); 1.393 + synchronized(lock) { 1.394 + System.out.println("Lock acquired"); 1.395 + } 1.396 + System.out.println("Lock released"); 1.397 + } 1.398 + }; 1.399 + thread.start(); 1.400 + try { 1.401 + thread.join(); 1.402 + } catch(InterruptedException ie) { 1.403 + } 1.404 + 1.405 + for (int i = 0; i < 20000; i++) { 1.406 + m8(false); 1.407 + } 1.408 + 1.409 + consume_all_memory(); 1.410 + 1.411 + try { 1.412 + m8(true); 1.413 + } catch(OutOfMemoryError oom) { 1.414 + free_memory(); 1.415 + System.out.println("OOM caught in main"); 1.416 + } 1.417 + 1.418 + free_memory(); 1.419 + 1.420 + try { 1.421 + m9(); 1.422 + } catch(OutOfMemoryError oom) { 1.423 + free_memory(); 1.424 + System.out.println("OOM caught in main"); 1.425 + } 1.426 + 1.427 + free_memory(); 1.428 + } 1.429 +}