Class SizeClasses

  • All Implemented Interfaces:
    SizeClassesMetric
    Direct Known Subclasses:
    PoolArena

    abstract class SizeClasses
    extends java.lang.Object
    implements SizeClassesMetric
    SizeClasses requires pageShifts to be defined prior to inclusion, and it in turn defines:

    LOG2_SIZE_CLASS_GROUP: Log of size class count for each size doubling. LOG2_MAX_LOOKUP_SIZE: Log of max size class in the lookup table. sizeClasses: Complete table of [index, log2Group, log2Delta, nDelta, isMultiPageSize, isSubPage, log2DeltaLookup] tuples. index: Size class index. log2Group: Log of group base size (no deltas added). log2Delta: Log of delta to previous size class. nDelta: Delta multiplier. isMultiPageSize: 'yes' if a multiple of the page size, 'no' otherwise. isSubPage: 'yes' if a subpage size class, 'no' otherwise. log2DeltaLookup: Same as log2Delta if a lookup table size class, 'no' otherwise.

    nSubpages: Number of subpages size classes. nSizes: Number of size classes. nPSizes: Number of size classes that are multiples of pageSize. smallMaxSizeIdx: Maximum small size class index. lookupMaxClass: Maximum size class included in lookup table. log2NormalMinClass: Log of minimum normal size class.

    The first size class and spacing are 1 << LOG2_QUANTUM. Each group has 1 << LOG2_SIZE_CLASS_GROUP of size classes. size = 1 << log2Group + nDelta * (1 << log2Delta) The first size class has an unusual encoding, because the size has to be split between group and delta*nDelta. If pageShift = 13, sizeClasses looks like this: (index, log2Group, log2Delta, nDelta, isMultiPageSize, isSubPage, log2DeltaLookup)

    ( 0, 4, 4, 0, no, yes, 4) ( 1, 4, 4, 1, no, yes, 4) ( 2, 4, 4, 2, no, yes, 4) ( 3, 4, 4, 3, no, yes, 4)

    ( 4, 6, 4, 1, no, yes, 4) ( 5, 6, 4, 2, no, yes, 4) ( 6, 6, 4, 3, no, yes, 4) ( 7, 6, 4, 4, no, yes, 4)

    ( 8, 7, 5, 1, no, yes, 5) ( 9, 7, 5, 2, no, yes, 5) ( 10, 7, 5, 3, no, yes, 5) ( 11, 7, 5, 4, no, yes, 5) ... ... ( 72, 23, 21, 1, yes, no, no) ( 73, 23, 21, 2, yes, no, no) ( 74, 23, 21, 3, yes, no, no) ( 75, 23, 21, 4, yes, no, no)

    ( 76, 24, 22, 1, yes, no, no)

    • Field Detail

      • pageSize

        protected final int pageSize
      • pageShifts

        protected final int pageShifts
      • chunkSize

        protected final int chunkSize
      • directMemoryCacheAlignment

        protected final int directMemoryCacheAlignment
      • nSizes

        final int nSizes
      • nSubpages

        final int nSubpages
      • nPSizes

        final int nPSizes
      • lookupMaxSize

        final int lookupMaxSize
      • smallMaxSizeIdx

        final int smallMaxSizeIdx
      • pageIdx2sizeTab

        private final int[] pageIdx2sizeTab
      • sizeIdx2sizeTab

        private final int[] sizeIdx2sizeTab
      • size2idxTab

        private final int[] size2idxTab
    • Constructor Detail

      • SizeClasses

        protected SizeClasses​(int pageSize,
                              int pageShifts,
                              int chunkSize,
                              int directMemoryCacheAlignment)
    • Method Detail

      • newSizeClass

        private static short[] newSizeClass​(int index,
                                            int log2Group,
                                            int log2Delta,
                                            int nDelta,
                                            int pageShifts)
      • newIdx2SizeTab

        private static int[] newIdx2SizeTab​(short[][] sizeClasses,
                                            int nSizes,
                                            int directMemoryCacheAlignment)
      • calculateSize

        private static int calculateSize​(int log2Group,
                                         int nDelta,
                                         int log2Delta)
      • sizeOf

        private static int sizeOf​(short[] sizeClass,
                                  int directMemoryCacheAlignment)
      • newPageIdx2sizeTab

        private static int[] newPageIdx2sizeTab​(short[][] sizeClasses,
                                                int nSizes,
                                                int nPSizes,
                                                int directMemoryCacheAlignment)
      • newSize2idxTab

        private static int[] newSize2idxTab​(int lookupMaxSize,
                                            short[][] sizeClasses)
      • sizeIdx2size

        public int sizeIdx2size​(int sizeIdx)
        Description copied from interface: SizeClassesMetric
        Computes size from lookup table according to sizeIdx.
        Specified by:
        sizeIdx2size in interface SizeClassesMetric
        Returns:
        size
      • pageIdx2size

        public long pageIdx2size​(int pageIdx)
        Description copied from interface: SizeClassesMetric
        Computes size from lookup table according to pageIdx.
        Specified by:
        pageIdx2size in interface SizeClassesMetric
        Returns:
        size which is multiples of pageSize.
      • pageIdx2sizeCompute

        public long pageIdx2sizeCompute​(int pageIdx)
        Description copied from interface: SizeClassesMetric
        Computes size according to pageIdx.
        Specified by:
        pageIdx2sizeCompute in interface SizeClassesMetric
        Returns:
        size which is multiples of pageSize
      • size2SizeIdx

        public int size2SizeIdx​(int size)
        Description copied from interface: SizeClassesMetric
        Normalizes request size up to the nearest size class.
        Specified by:
        size2SizeIdx in interface SizeClassesMetric
        Parameters:
        size - request size
        Returns:
        sizeIdx of the size class
      • pages2pageIdx

        public int pages2pageIdx​(int pages)
        Description copied from interface: SizeClassesMetric
        Normalizes request size up to the nearest pageSize class.
        Specified by:
        pages2pageIdx in interface SizeClassesMetric
        Parameters:
        pages - multiples of pageSizes
        Returns:
        pageIdx of the pageSize class
      • pages2pageIdxFloor

        public int pages2pageIdxFloor​(int pages)
        Description copied from interface: SizeClassesMetric
        Normalizes request size down to the nearest pageSize class.
        Specified by:
        pages2pageIdxFloor in interface SizeClassesMetric
        Parameters:
        pages - multiples of pageSizes
        Returns:
        pageIdx of the pageSize class
      • pages2pageIdxCompute

        private int pages2pageIdxCompute​(int pages,
                                         boolean floor)
      • alignSizeIfNeeded

        private static int alignSizeIfNeeded​(int size,
                                             int directMemoryCacheAlignment)
      • normalizeSize

        public int normalizeSize​(int size)
        Description copied from interface: SizeClassesMetric
        Normalizes usable size that would result from allocating an object with the specified size and alignment.
        Specified by:
        normalizeSize in interface SizeClassesMetric
        Parameters:
        size - request size
        Returns:
        normalized size
      • normalizeSizeCompute

        private static int normalizeSizeCompute​(int size)