Index: hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java =================================================================== --- hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java (revision 1519556) +++ hbase-common/src/main/java/org/apache/hadoop/hbase/util/ClassSize.java (working copy) @@ -106,6 +106,12 @@ /** Overhead for timerange */ public static final int TIMERANGE; + /** Overhead for TimeRangeTracker */ + public static final int TIMERANGE_TRACKER; + + /** Overhead for KeyValueSkipListSet */ + public static final int KEYVALUE_SKIPLIST_SET; + /* Are we running on jdk7? */ private static final boolean JDK7; static { @@ -184,6 +190,10 @@ COPYONWRITE_ARRAYLIST = align(OBJECT + (2 * REFERENCE) + ARRAY); TIMERANGE = align(ClassSize.OBJECT + Bytes.SIZEOF_LONG * 2 + Bytes.SIZEOF_BOOLEAN); + + TIMERANGE_TRACKER = align(ClassSize.OBJECT + Bytes.SIZEOF_LONG * 2); + + KEYVALUE_SKIPLIST_SET = align(OBJECT + REFERENCE); } /** Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueSkipListSet.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueSkipListSet.java (revision 1519556) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/KeyValueSkipListSet.java (working copy) @@ -44,7 +44,7 @@ * get and set and won't throw ConcurrentModificationException when iterating. */ @InterfaceAudience.Private -class KeyValueSkipListSet implements NavigableSet { +public class KeyValueSkipListSet implements NavigableSet { private final ConcurrentNavigableMap delegatee; KeyValueSkipListSet(final KeyValue.KVComparator c) { Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java (revision 1519556) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStore.java (working copy) @@ -962,8 +962,8 @@ public final static long DEEP_OVERHEAD = ClassSize.align(FIXED_OVERHEAD + ClassSize.REENTRANT_LOCK + ClassSize.ATOMIC_LONG + - ClassSize.COPYONWRITE_ARRAYSET + ClassSize.COPYONWRITE_ARRAYLIST + - (2 * ClassSize.CONCURRENT_SKIPLISTMAP)); + (2 * ClassSize.TIMERANGE_TRACKER) + + (2 * ClassSize.KEYVALUE_SKIPLIST_SET) + (2 * ClassSize.CONCURRENT_SKIPLISTMAP)); /** Used for readability when we don't store memstore timestamp in HFile */ public static final boolean NO_PERSISTENT_TS = false; Index: hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java (revision 1519556) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/io/TestHeapSize.java (working copy) @@ -47,7 +47,10 @@ import org.apache.hadoop.hbase.io.hfile.LruBlockCache; import org.apache.hadoop.hbase.regionserver.HRegion; import org.apache.hadoop.hbase.regionserver.HStore; +import org.apache.hadoop.hbase.regionserver.KeyValueSkipListSet; import org.apache.hadoop.hbase.regionserver.MemStore; +import org.apache.hadoop.hbase.regionserver.MemStoreLAB; +import org.apache.hadoop.hbase.regionserver.TimeRangeTracker; import org.apache.hadoop.hbase.util.ClassSize; import org.junit.BeforeClass; import org.junit.Test; @@ -225,7 +228,23 @@ assertEquals(expected, actual); } + // TimeRangeTracker + cl = TimeRangeTracker.class; + expected = ClassSize.estimateBase(cl, false); + actual = ClassSize.TIMERANGE_TRACKER; + if (expected != actual) { + ClassSize.estimateBase(cl, true); + assertEquals(expected, actual); + } + // KeyValueSkipListSet + cl = KeyValueSkipListSet.class; + expected = ClassSize.estimateBase(cl, false); + actual = ClassSize.KEYVALUE_SKIPLIST_SET; + if (expected != actual) { + ClassSize.estimateBase(cl, true); + assertEquals(expected, actual); + } } /** @@ -288,17 +307,19 @@ expected = ClassSize.estimateBase(cl, false); expected += ClassSize.estimateBase(ReentrantReadWriteLock.class, false); expected += ClassSize.estimateBase(AtomicLong.class, false); - expected += ClassSize.estimateBase(ConcurrentSkipListMap.class, false); - expected += ClassSize.estimateBase(ConcurrentSkipListMap.class, false); - expected += ClassSize.estimateBase(CopyOnWriteArraySet.class, false); - expected += ClassSize.estimateBase(CopyOnWriteArrayList.class, false); + expected += (2 * ClassSize.estimateBase(KeyValueSkipListSet.class, false)); + expected += (2 * ClassSize.estimateBase(ConcurrentSkipListMap.class, false)); + expected += (2 * ClassSize.estimateBase(TimeRangeTracker.class, false)); if(expected != actual) { ClassSize.estimateBase(cl, true); ClassSize.estimateBase(ReentrantReadWriteLock.class, true); ClassSize.estimateBase(AtomicLong.class, true); + ClassSize.estimateBase(KeyValueSkipListSet.class, true); + ClassSize.estimateBase(KeyValueSkipListSet.class, true); ClassSize.estimateBase(ConcurrentSkipListMap.class, true); - ClassSize.estimateBase(CopyOnWriteArraySet.class, true); - ClassSize.estimateBase(CopyOnWriteArrayList.class, true); + ClassSize.estimateBase(ConcurrentSkipListMap.class, true); + ClassSize.estimateBase(TimeRangeTracker.class, true); + ClassSize.estimateBase(TimeRangeTracker.class, true); assertEquals(expected, actual); }