java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
顶
原
荐
字数 502
阅读 36
收藏 1
starry Reactor Java Lucene SLF4J
21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>>
RamUsageEstimator,maven坐标:
<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对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、...
阿里云云栖社区
05/24
0
0
http://blog.csdn.net/zhoutao198712/article/details/7783070 到目前为止,还没有做明确的优化工作。只是做了初始化选择工作,比如说:JVM部署模型、JVM运行环境、收集哪些垃圾回收器的信息...
毛朱
2017/10/18
0
0
简介 Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码。 体系结构 JVM主要有子系统和内存...
亚特兰缇斯
2015/03/05
0
0
jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...
BazingaYou
2013/11/15
0
0
JVM参数调优:Eclipse启动实践 本文主要参考自《深入理解 Java 虚拟机》。 这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过...
天天顺利
2015/01/13
0
0
没有更多内容
加载失败,请刷新页面
加载更多编译和链接 我们都知道编译和链接是在静态语言开发中,必须要存在的过程。然而这中间所做的具体的事情以及为什么需要这么做,我想很多人是不清楚的。本文正是为大家解释,编译和链接的具体内...
jackie8tao
今天
3
0
1、apapche用户验证:访问网站时需要输入用户名和密码,验证通过后才能访问,增加安全性:比如管理登录后台的入口: 1、先针对根目录做认证:也就是说访问网站的时候会提示用户名和密码:才可以...
芬野de博客
今天
4
0
NFS介绍 NFS服务是 Network File System的缩写,用于网络上共享存储。 NFS数据传输基于RPC协议。 假如有三台机器a、b、c,它们要访问一个目录,目录里面有图片,一般情况是在三台机器上面都存...
黄昏残影
今天
3
0
JDK11正式版9月份就发布了,而且JDK12的构建版也出来了,突然发现自己好多项目用的还是7,8都还没有用熟练,有点恐慌是不是要被淘汰了。感觉恶补整理一份8的一个明显表示,Lambda表达式。当然...
小海bug
昨天
7
0
Anna's checking up on some orders today. As a result of some embarrassing mistakes in deliveries, Tip Top Trading's big boss in America has ordered a re-check of every order thi......
BruceLinxu
昨天
4
0
没有更多内容
加载失败,请刷新页面
加载更多以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- GreenPlum-查看表占用磁盘大小
- .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
- mariadb 内存占用优化
- MariaDB内存占用优化
- 清理docker占用空间
- 使用zram减少内存占用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
构建高可用Linux服务器(第3版)
余洪春 / 机械工业出版社 / 2014-10 / 79.00元
《构建高可用Linux服务器(第3版)》是Linux运维领域公认的经典畅销书,是国内51CTO、IT168等知名网站和多位资深运维专家共同推荐的运维工程师必备的工具书! “酒哥”在Linux运维领域潜心实践近10年,一直在运维一线,技术和思维都紧跟时代的发展,非常清楚运维工程师们需要什么,应该学习什么。本书不仅是他近10年工作经验的结晶,同时也是他的数万名读者和数十万粉丝共同需求和集体智慧的......一起来看看 《构建高可用Linux服务器(第3版)》 这本书的介绍吧!