Home / Class/ SizeClasses Class — netty Architecture

SizeClasses Class — netty Architecture

Architecture documentation for the SizeClasses class in SizeClasses.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff["SizeClasses"]
  95af4fd0_f0e7_759d_4f64_224f6b715722["SizeClasses.java"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|defined in| 95af4fd0_f0e7_759d_4f64_224f6b715722
  9682c31b_1e8c_cdd5_584a_e9f43b2c752a["SizeClasses()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 9682c31b_1e8c_cdd5_584a_e9f43b2c752a
  90408e2f_689e_0ba6_ef35_9b594fa267a8["newSizeClass()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 90408e2f_689e_0ba6_ef35_9b594fa267a8
  df10baa0_1f3b_513f_0212_4cc30a52f8ee["newIdx2SizeTab()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| df10baa0_1f3b_513f_0212_4cc30a52f8ee
  0fff0007_5d31_e6c3_579f_00f722ad4360["calculateSize()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 0fff0007_5d31_e6c3_579f_00f722ad4360
  23340afc_607e_6d69_aa04_02a9689ed359["sizeOf()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 23340afc_607e_6d69_aa04_02a9689ed359
  e2fe51ab_8c8a_4b5c_3a5f_336b659e0c62["newPageIdx2sizeTab()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| e2fe51ab_8c8a_4b5c_3a5f_336b659e0c62
  99df5c83_e8b2_f91b_cbd6_250b80d82602["newSize2idxTab()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 99df5c83_e8b2_f91b_cbd6_250b80d82602
  c6c6ff7d_ae35_e6df_477c_f81983261908["sizeIdx2size()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| c6c6ff7d_ae35_e6df_477c_f81983261908
  3b0c05d0_815b_b398_4d70_7023a40b5c50["sizeIdx2sizeCompute()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 3b0c05d0_815b_b398_4d70_7023a40b5c50
  28f779fe_e705_284f_1d74_54525cfbb7d6["pageIdx2size()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 28f779fe_e705_284f_1d74_54525cfbb7d6
  1215c79c_7dce_53dc_f8e8_39cd71cbbe1e["pageIdx2sizeCompute()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 1215c79c_7dce_53dc_f8e8_39cd71cbbe1e
  84194f88_a180_4e4f_24f0_73236d305f6d["size2SizeIdx()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 84194f88_a180_4e4f_24f0_73236d305f6d
  6f53d4d9_a4b5_17ff_fa8e_0d7908756327["pages2pageIdx()"]
  d1cbce7b_bd0a_5553_8e62_6deeb38137ff -->|method| 6f53d4d9_a4b5_17ff_fa8e_0d7908756327

Relationship Graph

Source Code

buffer/src/main/java/io/netty/buffer/SizeClasses.java lines 81–413

final class SizeClasses implements SizeClassesMetric {

    static final int LOG2_QUANTUM = 4;

    private static final int LOG2_SIZE_CLASS_GROUP = 2;
    private static final int LOG2_MAX_LOOKUP_SIZE = 12;

    private static final int LOG2GROUP_IDX = 1;
    private static final int LOG2DELTA_IDX = 2;
    private static final int NDELTA_IDX = 3;
    private static final int PAGESIZE_IDX = 4;
    private static final int SUBPAGE_IDX = 5;
    private static final int LOG2_DELTA_LOOKUP_IDX = 6;

    private static final byte no = 0, yes = 1;

    final int pageSize;
    final int pageShifts;
    final int chunkSize;
    final int directMemoryCacheAlignment;

    final int nSizes;
    final int nSubpages;
    final int nPSizes;
    final int lookupMaxSize;
    final int smallMaxSizeIdx;

    private final int[] pageIdx2sizeTab;

    // lookup table for sizeIdx < nSizes
    private final int[] sizeIdx2sizeTab;

    // lookup table used for size <= lookupMaxClass
    // spacing is 1 << LOG2_QUANTUM, so the size of array is lookupMaxClass >> LOG2_QUANTUM
    private final int[] size2idxTab;

    SizeClasses(int pageSize, int pageShifts, int chunkSize, int directMemoryCacheAlignment) {
        int group = log2(chunkSize) - LOG2_QUANTUM - LOG2_SIZE_CLASS_GROUP + 1;

        //generate size classes
        //[index, log2Group, log2Delta, nDelta, isMultiPageSize, isSubPage, log2DeltaLookup]
        short[][] sizeClasses = new short[group << LOG2_SIZE_CLASS_GROUP][7];

        int normalMaxSize = -1;
        int nSizes = 0;
        int size = 0;

        int log2Group = LOG2_QUANTUM;
        int log2Delta = LOG2_QUANTUM;
        int ndeltaLimit = 1 << LOG2_SIZE_CLASS_GROUP;

        //First small group, nDelta start at 0.
        //first size class is 1 << LOG2_QUANTUM
        for (int nDelta = 0; nDelta < ndeltaLimit; nDelta++, nSizes++) {
            short[] sizeClass = newSizeClass(nSizes, log2Group, log2Delta, nDelta, pageShifts);
            sizeClasses[nSizes] = sizeClass;
            size = sizeOf(sizeClass, directMemoryCacheAlignment);
        }

        log2Group += LOG2_SIZE_CLASS_GROUP;

        //All remaining groups, nDelta start at 1.
        for (; size < chunkSize; log2Group++, log2Delta++) {
            for (int nDelta = 1; nDelta <= ndeltaLimit && size < chunkSize; nDelta++, nSizes++) {
                short[] sizeClass = newSizeClass(nSizes, log2Group, log2Delta, nDelta, pageShifts);
                sizeClasses[nSizes] = sizeClass;
                size = normalMaxSize = sizeOf(sizeClass, directMemoryCacheAlignment);
            }
        }

        //chunkSize must be normalMaxSize
        assert chunkSize == normalMaxSize;

        int smallMaxSizeIdx = 0;
        int lookupMaxSize = 0;
        int nPSizes = 0;
        int nSubpages = 0;
        for (int idx = 0; idx < nSizes; idx++) {
            short[] sz = sizeClasses[idx];
            if (sz[PAGESIZE_IDX] == yes) {
                nPSizes++;

Frequently Asked Questions

What is the SizeClasses class?
SizeClasses is a class in the netty codebase, defined in buffer/src/main/java/io/netty/buffer/SizeClasses.java.
Where is SizeClasses defined?
SizeClasses is defined in buffer/src/main/java/io/netty/buffer/SizeClasses.java at line 81.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free