Class SimpleMemoryCalculator

java.lang.Object
com.tangosol.util.Base
com.tangosol.net.cache.SimpleMemoryCalculator
All Implemented Interfaces:
ConfigurableCacheMap.UnitCalculator
Direct Known Subclasses:
BinaryMemoryCalculator, SimpleMapIndex.IndexCalculator

public class SimpleMemoryCalculator extends Base implements ConfigurableCacheMap.UnitCalculator
A UnitCalculator implementation that weighs a cache entry based upon the amount of physical memory (in bytes) required to store the entry.

This implementation can only determine an accurate entry size if both the entry key and value object types are one of the following classes (or an array thereof or of the primitive forms thereof):

  • BigInteger
  • BigDecimal
  • Binary
  • Boolean
  • Byte
  • Character
  • Date
  • Double
  • Float
  • Integer
  • Long
  • Object
  • String
  • Time
  • Timestamp

If either the key or value object is not one of these types, an exception will be thrown during the unit calculation.

Author:
jh 2005.12.20
  • Field Details

    • SIZE_OBJECT_REF

      public static final int SIZE_OBJECT_REF
      The size (in bytes) of an object reference.

      On a 32 bit JVM, an object reference is 4 bytes. On a 64 bit JVM, an object reference is 8 bytes.

    • SIZE_OBJECT

      public static final int SIZE_OBJECT
      The size (in bytes) of an Object.
    • SIZE_BOOLEAN

      public static final int SIZE_BOOLEAN
      The size (in bytes) of a Boolean object.
    • SIZE_BYTE

      public static final int SIZE_BYTE
      The size (in bytes) of a Byte object.
    • SIZE_SHORT

      public static final int SIZE_SHORT
      The size (in bytes) of a Short object.
    • SIZE_CHARACTER

      public static final int SIZE_CHARACTER
      The size (in bytes) of a Character object.
    • SIZE_INTEGER

      public static final int SIZE_INTEGER
      The size (in bytes) of a Integer object.
    • SIZE_FLOAT

      public static final int SIZE_FLOAT
      The size (in bytes) of a Float object.
    • SIZE_LONG

      public static final int SIZE_LONG
      The size (in bytes) of a Long object.
    • SIZE_DOUBLE

      public static final int SIZE_DOUBLE
      The size (in bytes) of a Double object.
    • SIZE_DATE

      public static final int SIZE_DATE
      The size (in bytes) of a Date, Date or Time object.
    • SIZE_TIMESTAMP

      public static final int SIZE_TIMESTAMP
      The size (in bytes) of a Timestamp object.
    • SIZE_BIGINTEGER

      public static final int SIZE_BIGINTEGER
      The size (in bytes) of a BigInteger object.
    • SIZE_BIGDECIMAL

      public static final int SIZE_BIGDECIMAL
      The size (in bytes) of a BigDecimal object.
    • SIZE_STRING

      public static final int SIZE_STRING
      The minimum size (in bytes) of a String object.
    • SIZE_BINARY

      public static final int SIZE_BINARY
      The minimum size (in bytes) of a Binary object.
    • SIZE_ENTRY

      public static final int SIZE_ENTRY
      The minimum size (in bytes) of an LocalCache.Entry object.
    • MAP_FIXED_SIZES

      public static final Map MAP_FIXED_SIZES
      An immutable map of fixed-sized classes to instance size (in bytes).
    • MAP_PRIMITIVE_SIZES

      public static final Map MAP_PRIMITIVE_SIZES
      An immutable map of primitive types to their size (in bytes).
    • SIZE_BASIC_OBJECT

      protected static final int SIZE_BASIC_OBJECT
      The unaligned size of the simplest object.
  • Constructor Details

    • SimpleMemoryCalculator

      public SimpleMemoryCalculator()
  • Method Details

    • calculateUnits

      public int calculateUnits(Object oKey, Object oValue)
      Calculate a cache cost for the specified cache entry key and value.
      Specified by:
      calculateUnits in interface ConfigurableCacheMap.UnitCalculator
      Parameters:
      oKey - the cache key to evaluate for unit cost
      oValue - the cache value to evaluate for unit cost
      Returns:
      an integer value 0 or greater, with a larger value signifying a higher cost
    • getName

      public String getName()
      Obtain the name of the unit calculator. This is intended to be human readable for use in a monitoring tool; examples include "SimpleMemoryCalculator" and "BinaryMemoryCalculator".
      Specified by:
      getName in interface ConfigurableCacheMap.UnitCalculator
      Returns:
      the name of the unit calculator
    • getEntrySize

      protected int getEntrySize()
      Return the size of a map entry.
      Returns:
      the entry size
    • sizeOf

      public int sizeOf(Object o)
      Estimate the number of bytes of memory consumed by the given object.

      The calculation is based on the class of the given object, with reference types assumed to be aligned on a 8-byte boundary:

      Size of Various Types
      ClassSize
      boolean1
      byte1
      short2
      char2
      int4
      long8
      float4
      double8
      ObjectSIZE_OBJECT
      BooleanSIZE_OBJECT + 1
      ByteSIZE_OBJECT + 1
      ShortSIZE_OBJECT + 2
      CharacterSIZE_OBJECT + 2
      IntegerSIZE_OBJECT + 4
      LongSIZE_OBJECT + 8
      FloatSIZE_OBJECT + 4
      DoubleSIZE_OBJECT + 8
      BigIntegerSIZE_OBJECT + 48
      BigDecimalSIZE_OBJECT + 4 + SIZE_OBJECT_REF + SIZE_BIGINTEGER
      DateSIZE_OBJECT + SIZE_OBJECT_REF + 8
      TimeSIZE_OBJECT + SIZE_OBJECT_REF + 8
      TimestampSIZE_OBJECT + SIZE_OBJECT_REF + 12
      BinarySIZE_BINARY + array
      StringSIZE_STRING + array
      arraySIZE_OBJECT + 4 + [element size]*length()
      Parameters:
      o - the object to measure the size of
      Returns:
      an estimate of the number of bytes required to store the given object in memory
      Throws:
      IllegalArgumentException - if the type of the object is not one of the classes listed above
    • sizeOf

      protected int sizeOf(Class clz)
      Determine the minimum number of bytes required to store an instance of the given fixed-sized class in memory.

      The calculation is based on the following table, with reference types assumed to be aligned on an 16-byte boundary:

      Size of Various Types
      ClassSize
      boolean1
      byte1
      short2
      char2
      int4
      long8
      float4
      double8
      ObjectSIZE_OBJECT
      BooleanSIZE_OBJECT + 1
      ByteSIZE_OBJECT + 1
      ShortSIZE_OBJECT + 2
      CharacterSIZE_OBJECT + 2
      IntegerSIZE_OBJECT + 4
      LongSIZE_OBJECT + 8
      FloatSIZE_OBJECT + 4
      DoubleSIZE_OBJECT + 8
      BigIntegerSIZE_OBJECT + 48
      BigDecimalSIZE_OBJECT + 4 + SIZE_OBJECT_REF + SIZE_BIGINTEGER
      DateSIZE_OBJECT + SIZE_OBJECT_REF + 8
      TimeSIZE_OBJECT + SIZE_OBJECT_REF + 8
      TimestampSIZE_OBJECT + SIZE_OBJECT_REF + 12
      Parameters:
      clz - the target class
      Returns:
      the minimum number of bytes required to store an instance of the given class in memory
      Throws:
      IllegalArgumentException - if the type of the object is not one of the classes listed above
    • padMemorySize

      protected static int padMemorySize(int cb)
      Round the given number of bytes to the next closest integer that is divisible by 8.

      This method is used to pad the result of a memory calculation assuming that fields are ordered to minimize padding and that allocation granularity is 8 bytes.

      Parameters:
      cb - the number of bytes to round
      Returns:
      the input, rounded up to the nearest multiple of 8
    • calculateShallowSize

      protected static int calculateShallowSize(Class clz)
      Calculate the approximate number of bytes required to store an instance of the given class and its non-static fields in memory.

      The size calculation is shallow, in that fields that are references to variable-sized classes are not included in the estimate.

      Parameters:
      clz - the target class
      Returns:
      the number of bytes required to store an instance of the given class, including its non-static members
    • isInnerClass

      public static boolean isInnerClass(Class clz)
      Return true if a given class is an inner class.
      Parameters:
      clz - the class to check
      Returns:
      true if the provided class is an inner class
    • main

      public static void main(String[] asArg)
      Unit test.

      Usage:

       java com.tangosol.net.cache.SimpleMemoryCalculator [class name]
       
      Parameters:
      asArg - command line arguments