Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The new I/O (NIO) classes in java.nio allow the creation and use of direct buffers. These buffers tremendously increase throughput for repeated I/O activities. However, their creation and reclamation is more expensive than the creation and reclamation for heap-based nondirect buffers because direct buffers are managed using OS-specific native code. This added management cost makes direct buffers a poor choice for single-use or infrequently used cases. Direct buffers are also not subject to Java's garbage collector, which can cause memory leaks. Frequent allocation of large direct buffers can cause an OutOfMemoryError.

Noncompliant Code Example

This noncompliant code example uses both a short-lived local object rarelyUsedBuffer and a long-lived heavily used object heavilyUsedBuffer. Both are allocated in nonheap memory, and are not neither is garbage collected.

Code Block
bgColor#FFCCCC
ByteBuffer rarelyUsedBuffer = ByteBuffer.allocateDirect(8192);
// useUse rarelyUsedBuffer once

ByteBuffer heavilyUsedBuffer = ByteBuffer.allocateDirect(8192);
// useUse heavilyUsedBuffer many times

Compliant Solution

This compliant solution uses an indirect buffer to allocate the short-lived, infrequently used object. The heavily used buffer appropriately continues to use a nonheap, non-garbage-collected direct buffer.

Code Block
bgColor#ccccff
ByteBuffer rarelyUsedBuffer = ByteBuffer.allocate(8192);
// useUse rarelyUsedBuffer once

ByteBuffer heavilyUsedBuffer = ByteBuffer.allocateDirect(8192);
// useUse heavilyUsedBuffer many times

Applicability

Direct buffers are not subject to Java's garbage collector, which can cause memory leaks if they are used injudiciously.   In general, direct buffers should be allocated only when it can be shown that their use provides a significant gain in performance.

Bibliography

 

...