java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
2018-08-24 16:24
1176 查看
RamUsageEstimator,maven坐标:
RamUsageEstimator就是根据java对象在堆内存中的存储格式,
通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。
RamUsageEstimator的源码并不多,几百行,清晰可读。这里不进行一一解读了。
它在初始化的时候会根据当前JVM运行环境、CPU架构、运行参数、是否开启指针压缩、JDK版本等综合计算对象头的大小,而实例数据部分则按照java基础数据类型的标准大小进行计算。
思路简单,同时也在一定程度上反映出了Java对象格式的奥秘!
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>4.0.0</version> </dependency>
RamUsageEstimator就是根据java对象在堆内存中的存储格式,
通过计算Java对象头、实例数据、引用等的大小,相加而得,如果有引用,还能递归计算引用对象的大小。
RamUsageEstimator的源码并不多,几百行,清晰可读。这里不进行一一解读了。
它在初始化的时候会根据当前JVM运行环境、CPU架构、运行参数、是否开启指针压缩、JDK版本等综合计算对象头的大小,而实例数据部分则按照java基础数据类型的标准大小进行计算。
思路简单,同时也在一定程度上反映出了Java对象格式的奥秘!
import java.util.List; import java.util.concurrent.atomic.AtomicLong; import lombok.extern.slf4j.Slf4j; import org.apache.lucene.util.RamUsageEstimator; import reactor.fn.tuple.Tuple2; import reactor.fn.tuple.Tuple3; /* * * * Starry Starry Night * * __ __ * * \/---\/ * * ). .( * * ( (") ) * * ) ( * * / \ * * ( )`` * * ( \ /-\ / ) * * w'W W'w * * * author 杨春炼 * email qdcccc@gmail.com * date 2018-08-24 * */ @Slf4j public class ObjectUtil { public static Tuple3<Long, Long, String> size(Object o) { //计算指定对象本身在堆空间的大小,单位字节 long shallowSize = RamUsageEstimator.shallowSizeOf(o); //计算指定对象及其引用树上的所有对象的综合大小,单位字节 long size = RamUsageEstimator.sizeOf(o); //计算指定对象及其引用树上的所有对象的综合大小,返回可读的结果,如:2KB String humanSize = RamUsageEstimator.humanSizeOf(o); return Tuple3.of(shallowSize, size, humanSize); } // public static void main(String[] args) { // Tuple3<Long, Long, String> size = size(Tuple3.of(1, 1, "")); // System.out.println(size); // } public static Long multiSize(List<Tuple2<Object, Long>> object2Size) { AtomicLong memAll = new AtomicLong(); object2Size.forEach(t -> { Object object = t.getT1(); Long size = t.getT2(); if (object == null || size == null || size == 0) { return; } long l = RamUsageEstimator.shallowSizeOf(object); long mem = l * size; memAll.addAndGet(mem); }); return memAll.get(); } // public static void main(String[] args) { // ATest a = ATest.builder().a("1").build(); // BTest b = BTest.builder().a("1").b(1).c(newArrayList(1L, 2L, 3L, 4L, 5L, 6L)).build(); // List<Tuple2<Object, Long>> calculate = newArrayList(); // calculate.add(Tuple2.of(a, 10L)); // calculate.add(Tuple2.of(b, 100L)); // Long aLong = multiSize(calculate); // System.out.println(aLong); // } } //@Builder //class ATest { // // private String a; // //} // //@Builder //class BTest { // // private String a; // private Integer b; // private List<Long> c; //}
相关文章推荐
- 计算对象占用内存大小工具类
- Java计算一个对象占用内存的大小
- java对象占用内存大小计算方法
- Java计算一个对象占用内存的大小
- 精确计算一个Java对象占用的内存大小
- java对象占用内存大小计算方式
- java对象占用内存大小计算方式
- java计算内存大小 java计算对象占用内存大小
- 如何计算java对象占用的内存
- JAVA内存使用--如何计算一个Java对象占用的字节数
- java中计算对象内存大小
- java常用对象的内存占用大小
- Java对象占用内存大小
- 计算Java对象在内存中占用空间
- java对象的内存布局(一):计算java对象占用的内存空间以及java object layout
- JAVA——对象所占内存空间大小的计算
- 告诉你一个java对象占用的内存大小的方法
- java基础学习-java常用对象的内存占用大小
- java Object类占用内存大小计算
- java中获取对象所占用的内存大小