refine memory calculation
diff --git a/java/common/src/main/java/org/apache/tsfile/utils/BitMapArrayImpl.java b/java/common/src/main/java/org/apache/tsfile/utils/BitMapArrayImpl.java
index b553061..9e8a409 100644
--- a/java/common/src/main/java/org/apache/tsfile/utils/BitMapArrayImpl.java
+++ b/java/common/src/main/java/org/apache/tsfile/utils/BitMapArrayImpl.java
@@ -25,6 +25,12 @@
 
 class BitMapArrayImpl extends BitMapImpl {
 
+  // Object header + BitMapImpl.size (int) + BitMapArrayImpl.bits (reference).
+  private static final long INSTANCE_SIZE =
+      RamUsageEstimator.alignObjectSize(
+          (long) RamUsageEstimator.NUM_BYTES_OBJECT_HEADER
+              + Integer.BYTES
+              + RamUsageEstimator.NUM_BYTES_OBJECT_REF);
   private static final byte[] BIT_UTIL = new byte[] {1, 2, 4, 8, 16, 32, 64, -128};
   private static final byte[] UNMARK_BIT_UTIL =
       new byte[] {
@@ -278,8 +284,8 @@
 
   @Override
   long getRetainedSizeInBytes() {
-    return RamUsageEstimator.shallowSizeOfInstance(BitMapArrayImpl.class)
-        + RamUsageEstimator.alignObjectSize(RamUsageEstimator.NUM_BYTES_ARRAY_HEADER + bits.length);
+    // The byte array size includes its header, content, and object alignment.
+    return INSTANCE_SIZE + RamUsageEstimator.sizeOfByteArray(bits.length);
   }
 
   private void checkRange(int startPosition, int length) {
diff --git a/java/common/src/main/java/org/apache/tsfile/utils/BitMapLongImpl.java b/java/common/src/main/java/org/apache/tsfile/utils/BitMapLongImpl.java
index 09dedcf..452c7f0 100644
--- a/java/common/src/main/java/org/apache/tsfile/utils/BitMapLongImpl.java
+++ b/java/common/src/main/java/org/apache/tsfile/utils/BitMapLongImpl.java
@@ -24,6 +24,13 @@
 class BitMapLongImpl extends BitMapImpl {
 
   private static final long ALL_BITS_MARKED = -1L;
+  // Object header + BitMapImpl.size (int) + bits (long) + paddingByte (byte).
+  private static final long INSTANCE_SIZE =
+      RamUsageEstimator.alignObjectSize(
+          (long) RamUsageEstimator.NUM_BYTES_OBJECT_HEADER
+              + Integer.BYTES
+              + Long.BYTES
+              + Byte.BYTES);
 
   private long bits;
   // BitMap serialization always has one extra byte, which does not fit in bits at size 64.
@@ -205,7 +212,7 @@
 
   @Override
   long getRetainedSizeInBytes() {
-    return RamUsageEstimator.shallowSizeOfInstance(BitMapLongImpl.class);
+    return INSTANCE_SIZE;
   }
 
   static long lowerBitsMask(int length) {
diff --git a/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java b/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
index 89e565c..e70a00f 100644
--- a/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
+++ b/java/common/src/main/java/org/apache/tsfile/utils/RamUsageEstimator.java
@@ -123,7 +123,6 @@
 
     LOCAL_DATE_ARRAY_SIZE = RamUsageEstimator.shallowSizeOf(LocalDate[].class);
     LOCAL_DATE_SIZE = RamUsageEstimator.shallowSizeOf(LocalDate.class);
-    BIT_MAP_SIZE = RamUsageEstimator.shallowSizeOfInstance(BitMap.class);
     SIZE_OF_ARRAYLIST = RamUsageEstimator.shallowSizeOfInstance(ArrayList.class);
   }
 
@@ -197,6 +196,8 @@
     }
 
     ALIGN_MASK = NUM_BYTES_OBJECT_ALIGNMENT - 1;
+    // Object header + BitMap.implementation (reference).
+    BIT_MAP_SIZE = alignObjectSize((long) NUM_BYTES_OBJECT_HEADER + NUM_BYTES_OBJECT_REF);
 
     // get min/max value of cached Long class instances:
     long longCacheMinValue = 0;