HBASE-9430 Memstore heapSize calculation - DEEP_OVERHEAD is incorrect

git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1524914 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
anoopsamjohn 2013-09-20 06:46:51 +00:00
parent ab5e4b98d0
commit 0541a8da5c
4 changed files with 40 additions and 9 deletions

View File

@ -103,6 +103,12 @@ public class ClassSize {
/** 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 {
@ -181,6 +187,10 @@ public class ClassSize {
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);
}
/**

View File

@ -44,7 +44,7 @@ import java.util.concurrent.ConcurrentSkipListMap;
* get and set and won't throw ConcurrentModificationException when iterating.
*/
@InterfaceAudience.Private
class KeyValueSkipListSet implements NavigableSet<KeyValue> {
public class KeyValueSkipListSet implements NavigableSet<KeyValue> {
private final ConcurrentNavigableMap<KeyValue, KeyValue> delegatee;
KeyValueSkipListSet(final KeyValue.KVComparator c) {

View File

@ -962,8 +962,8 @@ public class MemStore implements HeapSize {
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;

View File

@ -47,7 +47,10 @@ import org.apache.hadoop.hbase.io.hfile.CachedBlock;
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 @@ public class TestHeapSize {
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 @@ public class TestHeapSize {
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);
}