< prev index next >

src/java.base/share/classes/java/nio/Bits.java

Print this page




  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.nio;
  27 
  28 import java.util.concurrent.atomic.AtomicLong;
  29 
  30 import jdk.internal.misc.JavaNioAccess;
  31 import jdk.internal.misc.JavaLangRefAccess;
  32 import jdk.internal.misc.SharedSecrets;
  33 import jdk.internal.misc.Unsafe;
  34 import jdk.internal.misc.VM;


  35 
  36 /**
  37  * Access to bits, native and otherwise.
  38  */
  39 
  40 class Bits {                            // package-private
  41 
  42     private Bits() { }
  43 
  44 
  45     // -- Swapping --
  46 
  47     static short swap(short x) {
  48         return Short.reverseBytes(x);
  49     }
  50 
  51     static char swap(char x) {
  52         return Character.reverseBytes(x);
  53     }
  54 


 609     // which means that OOME will be thrown after 0.5 s of trying
 610     private static final int MAX_SLEEPS = 9;
 611 
 612     // These methods should be called whenever direct memory is allocated or
 613     // freed.  They allow the user to control the amount of direct memory
 614     // which a process may access.  All sizes are specified in bytes.
 615     static void reserveMemory(long size, int cap) {
 616 
 617         if (!memoryLimitSet && VM.isBooted()) {
 618             maxMemory = VM.maxDirectMemory();
 619             memoryLimitSet = true;
 620         }
 621 
 622         // optimist!
 623         if (tryReserveMemory(size, cap)) {
 624             return;
 625         }
 626 
 627         final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess();
 628 
 629         // retry while helping enqueue pending Reference objects
 630         // which includes executing pending Cleaner(s) which includes
 631         // Cleaner(s) that free direct buffer memory
 632         while (jlra.tryHandlePendingReference()) {


 633             if (tryReserveMemory(size, cap)) {
 634                 return;
 635             }
 636         }
 637 
 638         // trigger VM's Reference processing
 639         System.gc();
 640 
 641         // a retry loop with exponential back-off delays
 642         // (this gives VM some time to do it's job)
 643         boolean interrupted = false;
 644         try {
 645             long sleepTime = 1;
 646             int sleeps = 0;
 647             while (true) {
 648                 if (tryReserveMemory(size, cap)) {
 649                     return;
 650                 }
 651                 if (sleeps >= MAX_SLEEPS) {
 652                     break;
 653                 }
 654                 if (!jlra.tryHandlePendingReference()) {

 655                     try {
 656                         Thread.sleep(sleepTime);
 657                         sleepTime <<= 1;
 658                         sleeps++;
 659                     } catch (InterruptedException e) {
 660                         interrupted = true;
 661                     }
 662                 }
 663             }
 664 
 665             // no luck
 666             throw new OutOfMemoryError("Direct buffer memory");
 667 
 668         } finally {
 669             if (interrupted) {
 670                 // don't swallow interrupts
 671                 Thread.currentThread().interrupt();
 672             }
 673         }
 674     }




  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package java.nio;
  27 
  28 import java.util.concurrent.atomic.AtomicLong;
  29 
  30 import jdk.internal.misc.JavaNioAccess;
  31 import jdk.internal.misc.JavaLangRefAccess;
  32 import jdk.internal.misc.SharedSecrets;
  33 import jdk.internal.misc.Unsafe;
  34 import jdk.internal.misc.VM;
  35 import jdk.internal.ref.CleanerFactory;
  36 import jdk.internal.ref.CleanerImpl;
  37 
  38 /**
  39  * Access to bits, native and otherwise.
  40  */
  41 
  42 class Bits {                            // package-private
  43 
  44     private Bits() { }
  45 
  46 
  47     // -- Swapping --
  48 
  49     static short swap(short x) {
  50         return Short.reverseBytes(x);
  51     }
  52 
  53     static char swap(char x) {
  54         return Character.reverseBytes(x);
  55     }
  56 


 611     // which means that OOME will be thrown after 0.5 s of trying
 612     private static final int MAX_SLEEPS = 9;
 613 
 614     // These methods should be called whenever direct memory is allocated or
 615     // freed.  They allow the user to control the amount of direct memory
 616     // which a process may access.  All sizes are specified in bytes.
 617     static void reserveMemory(long size, int cap) {
 618 
 619         if (!memoryLimitSet && VM.isBooted()) {
 620             maxMemory = VM.maxDirectMemory();
 621             memoryLimitSet = true;
 622         }
 623 
 624         // optimist!
 625         if (tryReserveMemory(size, cap)) {
 626             return;
 627         }
 628 
 629         final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess();
 630 
 631         // retry while:
 632         // - helping enqueue pending Reference objects which includes Cleanable(s)
 633         // - helping processing the queue of Cleanable(s) which includes the ones
 634         //   that free direct buffer memory
 635         while (jlra.tryHandlePendingReference() | // use non-short-circuit or
 636                CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) {
 637             if (tryReserveMemory(size, cap)) {
 638                 return;
 639             }
 640         }
 641 
 642         // trigger VM's Reference processing
 643         System.gc();
 644 
 645         // a retry loop with exponential back-off delays
 646         // (this gives VM some time to do it's job)
 647         boolean interrupted = false;
 648         try {
 649             long sleepTime = 1;
 650             int sleeps = 0;
 651             while (true) {
 652                 if (tryReserveMemory(size, cap)) {
 653                     return;
 654                 }
 655                 if (sleeps >= MAX_SLEEPS) {
 656                     break;
 657                 }
 658                 if (!jlra.tryHandlePendingReference() & // use non-short-circuit and
 659                     !CleanerImpl.getCleanerImpl(CleanerFactory.cleaner()).drainQueue()) {
 660                     try {
 661                         Thread.sleep(sleepTime);
 662                         sleepTime <<= 1;
 663                         sleeps++;
 664                     } catch (InterruptedException e) {
 665                         interrupted = true;
 666                     }
 667                 }
 668             }
 669 
 670             // no luck
 671             throw new OutOfMemoryError("Direct buffer memory");
 672 
 673         } finally {
 674             if (interrupted) {
 675                 // don't swallow interrupts
 676                 Thread.currentThread().interrupt();
 677             }
 678         }
 679     }


< prev index next >