1 /* 2 * Copyright (c) 2020, 2022, Red Hat, Inc. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8253525 27 * @summary Test for fInst.getObjectSize with 32-bit compressed oops 28 * @library /test/lib 29 * 30 * @build jdk.test.whitebox.WhiteBox 31 * @run build GetObjectSizeIntrinsicsTest 32 * @run shell MakeJAR.sh basicAgent 33 * 34 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 35 * 36 * @run main/othervm -Xmx128m 37 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 38 * -Xint 39 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 40 * 41 * @run main/othervm -Xmx128m 42 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 43 * -Xbatch -XX:TieredStopAtLevel=1 44 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 45 * 46 * @run main/othervm -Xmx128m 47 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 48 * -Xbatch -XX:-TieredCompilation 49 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 50 */ 51 52 /* 53 * @test 54 * @summary Test for fInst.getObjectSize with zero-based compressed oops 55 * @library /test/lib 56 * @requires vm.bits == 64 57 * 58 * @build jdk.test.whitebox.WhiteBox 59 * @run build GetObjectSizeIntrinsicsTest 60 * @run shell MakeJAR.sh basicAgent 61 * 62 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 63 * 64 * @run main/othervm -Xmx4g 65 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 66 * -Xint 67 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 68 * 69 * @run main/othervm -Xmx4g 70 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 71 * -Xbatch -XX:TieredStopAtLevel=1 72 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 73 * 74 * @run main/othervm -Xmx4g 75 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 76 * -Xbatch -XX:-TieredCompilation 77 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 78 */ 79 80 /* 81 * @test 82 * @summary Test for fInst.getObjectSize without compressed oops 83 * @library /test/lib 84 * @requires vm.bits == 64 85 * 86 * @build jdk.test.whitebox.WhiteBox 87 * @run build GetObjectSizeIntrinsicsTest 88 * @run shell MakeJAR.sh basicAgent 89 * 90 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 91 * 92 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 93 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 94 * -Xint 95 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 96 * 97 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 98 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 99 * -Xbatch -XX:TieredStopAtLevel=1 100 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 101 * 102 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 103 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 104 * -Xbatch -XX:-TieredCompilation 105 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 106 */ 107 108 /* 109 * @test 110 * @summary Test for fInst.getObjectSize with 32-bit compressed oops 111 * @library /test/lib 112 * @requires vm.debug 113 * 114 * @build jdk.test.whitebox.WhiteBox 115 * @run build GetObjectSizeIntrinsicsTest 116 * @run shell MakeJAR.sh basicAgent 117 * 118 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 119 * 120 * @run main/othervm -Xmx128m 121 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 122 * -XX:FastAllocateSizeLimit=0 123 * -Xint 124 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 125 * 126 * @run main/othervm -Xmx128m 127 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 128 * -XX:FastAllocateSizeLimit=0 129 * -Xbatch -XX:TieredStopAtLevel=1 130 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 131 * 132 * @run main/othervm -Xmx128m 133 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 134 * -XX:FastAllocateSizeLimit=0 135 * -Xbatch -XX:-TieredCompilation 136 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 137 */ 138 139 /* 140 * @test 141 * @summary Test for fInst.getObjectSize with zero-based compressed oops 142 * @library /test/lib 143 * @requires vm.bits == 64 144 * @requires vm.debug 145 * 146 * @build jdk.test.whitebox.WhiteBox 147 * @run build GetObjectSizeIntrinsicsTest 148 * @run shell MakeJAR.sh basicAgent 149 * 150 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 151 * 152 * @run main/othervm -Xmx4g 153 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 154 * -XX:FastAllocateSizeLimit=0 155 * -Xint 156 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 157 * 158 * @run main/othervm -Xmx4g 159 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 160 * -XX:FastAllocateSizeLimit=0 161 * -Xbatch -XX:TieredStopAtLevel=1 162 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 163 * 164 * @run main/othervm -Xmx4g 165 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 166 * -XX:FastAllocateSizeLimit=0 167 * -Xbatch -XX:-TieredCompilation 168 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 169 */ 170 171 /* 172 * @test 173 * @summary Test for fInst.getObjectSize without compressed oops 174 * @library /test/lib 175 * @requires vm.bits == 64 176 * @requires vm.debug 177 * 178 * @build jdk.test.whitebox.WhiteBox 179 * @run build GetObjectSizeIntrinsicsTest 180 * @run shell MakeJAR.sh basicAgent 181 * 182 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 183 * 184 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 185 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 186 * -XX:FastAllocateSizeLimit=0 187 * -Xint 188 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 189 * 190 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 191 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 192 * -XX:FastAllocateSizeLimit=0 193 * -Xbatch -XX:TieredStopAtLevel=1 194 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 195 * 196 * @run main/othervm -Xmx128m -XX:-UseCompressedOops 197 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 198 * -XX:FastAllocateSizeLimit=0 199 * -Xbatch -XX:-TieredCompilation 200 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 201 */ 202 203 /* 204 * @test 205 * @summary Test for fInst.getObjectSize with 32-bit compressed oops 206 * @library /test/lib 207 * @requires vm.bits == 64 208 * @requires vm.debug 209 * 210 * @build jdk.test.whitebox.WhiteBox 211 * @run build GetObjectSizeIntrinsicsTest 212 * @run shell MakeJAR.sh basicAgent 213 * 214 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 215 * 216 * @run main/othervm -Xmx128m 217 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 218 * -XX:ObjectAlignmentInBytes=32 219 * -Xint 220 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 221 * 222 * @run main/othervm -Xmx128m 223 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 224 * -XX:ObjectAlignmentInBytes=32 225 * -Xbatch -XX:TieredStopAtLevel=1 226 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 227 * 228 * @run main/othervm -Xmx128m 229 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 230 * -XX:ObjectAlignmentInBytes=32 231 * -Xbatch -XX:-TieredCompilation 232 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 233 */ 234 235 /* 236 * @test 237 * @summary Test for fInst.getObjectSize with zero-based compressed oops 238 * @library /test/lib 239 * @requires vm.bits == 64 240 * @requires vm.debug 241 * 242 * @build jdk.test.whitebox.WhiteBox 243 * @run build GetObjectSizeIntrinsicsTest 244 * @run shell MakeJAR.sh basicAgent 245 * 246 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 247 * 248 * @run main/othervm -Xmx4g 249 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 250 * -XX:ObjectAlignmentInBytes=32 251 * -Xint 252 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 253 * 254 * @run main/othervm -Xmx4g 255 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 256 * -XX:ObjectAlignmentInBytes=32 257 * -Xbatch -XX:TieredStopAtLevel=1 258 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 259 * 260 * @run main/othervm -Xmx4g 261 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 262 * -XX:ObjectAlignmentInBytes=32 263 * -Xbatch -XX:-TieredCompilation 264 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest 265 */ 266 267 /* 268 * @test 269 * @summary Test for fInst.getObjectSize with large arrays 270 * @library /test/lib 271 * @requires vm.bits == 64 272 * @requires vm.debug 273 * @requires os.maxMemory >= 10G 274 * 275 * @build jdk.test.whitebox.WhiteBox 276 * @run build GetObjectSizeIntrinsicsTest 277 * @run shell MakeJAR.sh basicAgent 278 * 279 * @run driver jdk.test.lib.helpers.ClassFileInstaller jdk.test.whitebox.WhiteBox 280 * 281 * @run main/othervm/timeout=300 -Xmx8g 282 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 283 * -Xint 284 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest large 285 * 286 * @run main/othervm/timeout=240 -Xmx8g 287 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 288 * -Xbatch -XX:TieredStopAtLevel=1 289 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest large 290 * 291 * @run main/othervm/timeout=180 -Xmx8g 292 * -XX:+UnlockDiagnosticVMOptions -XX:+AbortVMOnCompilationFailure -XX:+WhiteBoxAPI -Xbootclasspath/a:. 293 * -Xbatch -XX:-TieredCompilation 294 * -javaagent:basicAgent.jar GetObjectSizeIntrinsicsTest GetObjectSizeIntrinsicsTest large 295 */ 296 297 import java.util.*; 298 299 import jdk.test.lib.Platform; 300 import jdk.test.whitebox.WhiteBox; 301 302 public class GetObjectSizeIntrinsicsTest extends ASimpleInstrumentationTestCase { 303 304 static final Boolean COMPRESSED_OOPS = WhiteBox.getWhiteBox().getBooleanVMFlag("UseCompressedOops"); 305 static final long REF_SIZE = (COMPRESSED_OOPS == null || COMPRESSED_OOPS == true) ? 4 : 8; 306 307 static final Long align = WhiteBox.getWhiteBox().getIntxVMFlag("ObjectAlignmentInBytes"); 308 static final int OBJ_ALIGN = (align == null ? 8 : align.intValue()); 309 310 static final int SMALL_ARRAY_SIZE = 1024; 311 312 // These should overflow 4G size boundary 313 static final int LARGE_INT_ARRAY_SIZE = 1024*1024*1024 + 1024; 314 static final int LARGE_OBJ_ARRAY_SIZE = (4096/(int)REF_SIZE)*1024*1024 + 1024; 315 316 static final boolean COMPACT_HEADERS = WhiteBox.getWhiteBox().getBooleanVMFlag("UseCompactObjectHeaders"); 317 static final int HEADER_SIZE = COMPACT_HEADERS ? 8 : (Platform.is64bit() ? 16 : 8); 318 319 final String mode; 320 321 public GetObjectSizeIntrinsicsTest(String name, String mode) { 322 super(name); 323 this.mode = mode; 324 } 325 326 public static void main(String[] args)throws Throwable { 327 new GetObjectSizeIntrinsicsTest(args[0], (args.length >= 2 ? args[1] : "")).runTest(); 328 } 329 330 public static final int ITERS = 200_000; 331 332 public static void assertEquals(long expected, long actual) { 333 if (expected != actual) { 334 throw new IllegalStateException( 335 "Error: expected: " + expected + " (" + Long.toHexString(expected) + 336 "), actual: " + actual + " (" + Long.toHexString(actual) + ")"); 337 } 338 } 339 340 public static void assertNotEquals(long notExpected, long actual) { 341 if (notExpected == actual) { 342 throw new IllegalStateException( 343 "Error: not expected: " + notExpected + " (" + Long.toHexString(notExpected) + 344 "), actual: " + actual + " (" + Long.toHexString(actual) + ")"); 345 } 346 } 347 348 public static void assertFail() { 349 throw new IllegalStateException("Should not be here"); 350 } 351 352 protected final void doRunTest() throws Throwable { 353 testSize_newObject(); 354 testSize_localObject(); 355 testSize_fieldObject(); 356 357 testSize_newSmallIntArray(); 358 testSize_localSmallIntArray(); 359 testSize_fieldSmallIntArray(); 360 361 testSize_newSmallObjArray(); 362 testSize_localSmallObjArray(); 363 testSize_fieldSmallObjArray(); 364 365 if (mode.equals("large")) { 366 testSize_localLargeIntArray(); 367 testSize_localLargeObjArray(); 368 } 369 370 testNulls(); 371 } 372 373 private static long roundUp(long v, long a) { 374 return (v + a - 1) / a * a; 375 } 376 377 private void testSize_newObject() { 378 long expected = roundUp(HEADER_SIZE, OBJ_ALIGN); 379 for (int c = 0; c < ITERS; c++) { 380 assertEquals(expected, fInst.getObjectSize(new Object())); 381 } 382 } 383 384 private void testSize_localObject() { 385 long expected = roundUp(HEADER_SIZE, OBJ_ALIGN); 386 Object o = new Object(); 387 for (int c = 0; c < ITERS; c++) { 388 assertEquals(expected, fInst.getObjectSize(o)); 389 } 390 } 391 392 static Object staticO = new Object(); 393 394 private void testSize_fieldObject() { 395 long expected = roundUp(HEADER_SIZE, OBJ_ALIGN); 396 for (int c = 0; c < ITERS; c++) { 397 assertEquals(expected, fInst.getObjectSize(staticO)); 398 } 399 } 400 401 private void testSize_newSmallIntArray() { 402 long expected = roundUp(4L*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 403 for (int c = 0; c < ITERS; c++) { 404 assertEquals(expected, fInst.getObjectSize(new int[SMALL_ARRAY_SIZE])); 405 } 406 } 407 408 private void testSize_localSmallIntArray() { 409 int[] arr = new int[SMALL_ARRAY_SIZE]; 410 long expected = roundUp(4L*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 411 for (int c = 0; c < ITERS; c++) { 412 assertEquals(expected, fInst.getObjectSize(arr)); 413 } 414 } 415 416 static int[] smallArr = new int[SMALL_ARRAY_SIZE]; 417 418 private void testSize_fieldSmallIntArray() { 419 long expected = roundUp(4L*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 420 for (int c = 0; c < ITERS; c++) { 421 assertEquals(expected, fInst.getObjectSize(smallArr)); 422 } 423 } 424 425 private void testSize_newSmallObjArray() { 426 long expected = roundUp(REF_SIZE*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 427 for (int c = 0; c < ITERS; c++) { 428 assertEquals(expected, fInst.getObjectSize(new Object[SMALL_ARRAY_SIZE])); 429 } 430 } 431 432 private void testSize_localSmallObjArray() { 433 Object[] arr = new Object[SMALL_ARRAY_SIZE]; 434 long expected = roundUp(REF_SIZE*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 435 for (int c = 0; c < ITERS; c++) { 436 assertEquals(expected, fInst.getObjectSize(arr)); 437 } 438 } 439 440 static Object[] smallObjArr = new Object[SMALL_ARRAY_SIZE]; 441 442 private void testSize_fieldSmallObjArray() { 443 long expected = roundUp(REF_SIZE*SMALL_ARRAY_SIZE + 16, OBJ_ALIGN); 444 for (int c = 0; c < ITERS; c++) { 445 assertEquals(expected, fInst.getObjectSize(smallObjArr)); 446 } 447 } 448 449 private void testSize_localLargeIntArray() { 450 int[] arr = new int[LARGE_INT_ARRAY_SIZE]; 451 long expected = roundUp(4L*LARGE_INT_ARRAY_SIZE + 16, OBJ_ALIGN); 452 for (int c = 0; c < ITERS; c++) { 453 assertEquals(expected, fInst.getObjectSize(arr)); 454 } 455 } 456 457 private void testSize_localLargeObjArray() { 458 Object[] arr = new Object[LARGE_OBJ_ARRAY_SIZE]; 459 long expected = roundUp(REF_SIZE*LARGE_OBJ_ARRAY_SIZE + 16, OBJ_ALIGN); 460 for (int c = 0; c < ITERS; c++) { 461 assertEquals(expected, fInst.getObjectSize(arr)); 462 } 463 } 464 465 private void testNulls() { 466 for (int c = 0; c < ITERS; c++) { 467 try { 468 fInst.getObjectSize(null); 469 assertFail(); 470 } catch (NullPointerException e) { 471 // expected 472 } 473 } 474 } 475 476 }