net.i2p.util
Class ByteCache

java.lang.Object
  extended by net.i2p.util.ByteCache

public final class ByteCache
extends Object

Cache the objects frequently used to reduce memory churn. The ByteArray should be held onto as long as the data referenced in it is needed. For small arrays where the management of valid bytes in ByteArray and prezeroing isn't required, use SimpleByteArray instead. Heap size control - survey of usage:

        Size    Max     MaxMem  From

        1K      32      32K     tunnel TrivialPreprocessor
        1K      512     512K    tunnel FragmentHandler
        1K      512     512K    I2NP TunnelDataMessage
        1K      512     512K    tunnel FragmentedMessage

        1730    128     216K    streaming MessageOutputStream

        2K      64      128K    UDP IMS

        4K      32      128K    I2PTunnelRunner

        8K      8       64K     I2PTunnel HTTPResponseOutputStream

        16K     16      256K    I2PSnark

        32K     4       128K    SAM StreamSession
        32K     10      320K    SAM v2StreamSession
        32K     64      2M      UDP OMS
        32K     128     4M      streaming MessageInputStream

        36K     64      2.25M   streaming PacketQueue

        40K     8       320K    DataHelper decompress

        64K     64      4M      UDP MessageReceiver - disabled in 0.7.14
  


Method Summary
 ByteArray acquire()
          Get the next available structure, either from the cache or a brand new one.
static void clearAll()
          Clear everything (memory pressure)
static ByteCache getInstance(int cacheSize, int size)
          Get a cache responsible for objects of the given size.
 void release(ByteArray entry)
          Put this structure back onto the available cache for reuse
 void release(ByteArray entry, boolean shouldZero)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

getInstance

public static ByteCache getInstance(int cacheSize,
                                    int size)
Get a cache responsible for objects of the given size. Warning, if you store the result in a static field, the cleaners will not operate after a restart on Android, as the old context's SimpleScheduler will have shut down. TODO tie this to the context or clean up all calls.

Parameters:
cacheSize - how large we want the cache to grow (number of objects, NOT memory size) before discarding released objects. Since 0.7.14, a limit of 1MB / size is enforced for the typical 128MB max memory JVM
size - how large should the objects cached be?

clearAll

public static void clearAll()
Clear everything (memory pressure)

Since:
0.7.14

acquire

public final ByteArray acquire()
Get the next available structure, either from the cache or a brand new one. Returned ByteArray will have valid = 0 and offset = 0. Returned ByteArray may or may not be zero, depends on whether release(ba) or release(ba, false) was called. Which is a problem, you should really specify shouldZero on acquire, not release.


release

public final void release(ByteArray entry)
Put this structure back onto the available cache for reuse


release

public final void release(ByteArray entry,
                          boolean shouldZero)