550 551 // -- Unsafe access -- 552 553 private static final Unsafe unsafe = Unsafe.getUnsafe(); 554 555 private static byte _get(long a) { 556 return unsafe.getByte(a); 557 } 558 559 private static void _put(long a, byte b) { 560 unsafe.putByte(a, b); 561 } 562 563 static Unsafe unsafe() { 564 return unsafe; 565 } 566 567 568 // -- Processor and memory-system properties -- 569 570 private static final ByteOrder byteOrder; 571 572 static ByteOrder byteOrder() { 573 if (byteOrder == null) 574 throw new Error("Unknown byte order"); 575 return byteOrder; 576 } 577 578 static { 579 long a = unsafe.allocateMemory(8); 580 try { 581 unsafe.putLong(a, 0x0102030405060708L); 582 byte b = unsafe.getByte(a); 583 switch (b) { 584 case 0x01: byteOrder = ByteOrder.BIG_ENDIAN; break; 585 case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN; break; 586 default: 587 assert false; 588 byteOrder = null; 589 } 590 } finally { 591 unsafe.freeMemory(a); 592 } 593 } 594 595 596 private static int pageSize = -1; 597 598 static int pageSize() { 599 if (pageSize == -1) 600 pageSize = unsafe().pageSize(); 601 return pageSize; 602 } 603 604 static int pageCount(long size) { 605 return (int)(size + (long)pageSize() - 1L) / pageSize(); 606 } 607 608 private static boolean unaligned; 609 private static boolean unalignedKnown = false; 610 611 static boolean unaligned() { 612 if (unalignedKnown) 613 return unaligned; 614 String arch = AccessController.doPrivileged( 615 new sun.security.action.GetPropertyAction("os.arch")); 616 unaligned = arch.equals("i386") || arch.equals("x86") 617 || arch.equals("amd64") || arch.equals("x86_64"); 618 unalignedKnown = true; 619 return unaligned; 620 } 621 622 623 // -- Direct memory management -- 624 625 // A user-settable upper limit on the maximum amount of allocatable 626 // direct buffer memory. This value may be changed during VM 627 // initialization if it is launched with "-XX:MaxDirectMemorySize=<size>". 628 private static volatile long maxMemory = VM.maxDirectMemory(); 629 private static final AtomicLong reservedMemory = new AtomicLong(); 630 private static final AtomicLong totalCapacity = new AtomicLong(); 631 private static final AtomicLong count = new AtomicLong(); 632 private static volatile boolean memoryLimitSet = false; 633 // max. number of sleeps during try-reserving with exponentially 634 // increasing delay before throwing OutOfMemoryError: 635 // 1, 2, 4, 8, 16, 32, 64, 128, 256 (total 511 ms ~ 0.5 s) 636 // which means that OOME will be thrown after 0.5 s of trying 637 private static final int MAX_SLEEPS = 9; | 550 551 // -- Unsafe access -- 552 553 private static final Unsafe unsafe = Unsafe.getUnsafe(); 554 555 private static byte _get(long a) { 556 return unsafe.getByte(a); 557 } 558 559 private static void _put(long a, byte b) { 560 unsafe.putByte(a, b); 561 } 562 563 static Unsafe unsafe() { 564 return unsafe; 565 } 566 567 568 // -- Processor and memory-system properties -- 569 570 private static final ByteOrder byteOrder 571 = unsafe.getByteOrder() == Unsafe.LITTLE_ENDIAN ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN; 572 573 static ByteOrder byteOrder() { 574 if (byteOrder == null) 575 throw new Error("Unknown byte order"); 576 return byteOrder; 577 } 578 579 private static int pageSize = -1; 580 581 static int pageSize() { 582 if (pageSize == -1) 583 pageSize = unsafe().pageSize(); 584 return pageSize; 585 } 586 587 static int pageCount(long size) { 588 return (int)(size + (long)pageSize() - 1L) / pageSize(); 589 } 590 591 private static boolean unaligned; 592 private static boolean unalignedKnown = false; 593 594 static boolean unaligned() { 595 if (unalignedKnown) 596 return unaligned; 597 String arch = AccessController.doPrivileged( 598 new sun.security.action.GetPropertyAction("os.arch")); 599 unaligned = unsafe.unalignedAccess(); 600 unalignedKnown = true; 601 return unaligned; 602 } 603 604 605 // -- Direct memory management -- 606 607 // A user-settable upper limit on the maximum amount of allocatable 608 // direct buffer memory. This value may be changed during VM 609 // initialization if it is launched with "-XX:MaxDirectMemorySize=<size>". 610 private static volatile long maxMemory = VM.maxDirectMemory(); 611 private static final AtomicLong reservedMemory = new AtomicLong(); 612 private static final AtomicLong totalCapacity = new AtomicLong(); 613 private static final AtomicLong count = new AtomicLong(); 614 private static volatile boolean memoryLimitSet = false; 615 // max. number of sleeps during try-reserving with exponentially 616 // increasing delay before throwing OutOfMemoryError: 617 // 1, 2, 4, 8, 16, 32, 64, 128, 256 (total 511 ms ~ 0.5 s) 618 // which means that OOME will be thrown after 0.5 s of trying 619 private static final int MAX_SLEEPS = 9; |