原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

栏目: 编程工具 · 发布时间: 6年前

原 荐  <a href='https://www.codercto.com/topics/22013.html'>java</a> 计算对象占用内存大小:lucene专用于计算堆内存占用大小的 <a href='https://www.codercto.com/tool.html'>工具</a> 类

java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

  杨春炼 发布于 08/24 16:24

字数 502

阅读 36

收藏 1

starry Reactor Java Lucene SLF4J

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> 原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

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计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类

杨春炼

粉丝 10

博文 61

码字总数 33964

作品 0

海淀

高级程序员

加载中

评论( 2 )

原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
杨春炼

昨天 15:46

引用来自“阳光下的豚2011”的评论

好像很强大
just use simply
原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
阳光下的豚2011

前天 09:12

好像很强大

删除一条评论

评论删除后,数据将无法恢复

取消

确定

相关文章 最新文章

如何计算Java对象所占内存的大小

摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、...

阿里云云栖社区

05/24

0

0

原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
优化JVM:决定Java堆的大小以及内存占用

http://blog.csdn.net/zhoutao198712/article/details/7783070 到目前为止,还没有做明确的优化工作。只是做了初始化选择工作,比如说:JVM部署模型、JVM运行环境、收集哪些垃圾回收器的信息...

毛朱

2017/10/18

0

0

Java虚拟机(JVM)(自动内存管理机制)

简介 Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码。 体系结构 JVM主要有子系统和内存...

亚特兰缇斯

2015/03/05

0

0

JVM:查看java内存情况命令

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

BazingaYou

2013/11/15

0

0

JVM参数调优:Eclipse启动实践

JVM参数调优:Eclipse启动实践 本文主要参考自《深入理解 Java 虚拟机》。 这本书是国人写的难得的不是照搬代码注释的且不是废话连篇的技术书,内容涵盖了 Java 从源码到字节码到执行的整个过...

天天顺利

2015/01/13

0

0

没有更多内容

加载失败,请刷新页面

加载更多
动态链接和静态链接

编译和链接 我们都知道编译和链接是在静态语言开发中,必须要存在的过程。然而这中间所做的具体的事情以及为什么需要这么做,我想很多人是不清楚的。本文正是为大家解释,编译和链接的具体内...

jackie8tao

今天

3

0

原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
day43:Apache域名跳转、用户验证及访问格式

1、apapche用户验证:访问网站时需要输入用户名和密码,验证通过后才能访问,增加安全性:比如管理登录后台的入口: 1、先针对根目录做认证:也就是说访问网站的时候会提示用户名和密码:才可以...

芬野de博客

今天

4

0

原 荐 java计算对象占用内存大小:lucene专用于计算堆内存占用大小的工具类
NFS介绍、NFS服务端安装配置、NFS配置选项

NFS介绍 NFS服务是 Network File System的缩写,用于网络上共享存储。 NFS数据传输基于RPC协议。 假如有三台机器a、b、c,它们要访问一个目录,目录里面有图片,一般情况是在三台机器上面都存...

黄昏残影

今天

3

0

JDK1.8 Lambda 表达式的使用

JDK11正式版9月份就发布了,而且JDK12的构建版也出来了,突然发现自己好多项目用的还是7,8都还没有用熟练,有点恐慌是不是要被淘汰了。感觉恶补整理一份8的一个明显表示,Lambda表达式。当然...

小海bug

昨天

7

0

EnglishAtWork

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

没有更多内容

加载失败,请刷新页面

加载更多

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

你凭什么做好互联网

你凭什么做好互联网

曹政 / 中国友谊出版公司 / 2016-12 / 42.00元

为什么有人可以预见商机、超越景气,在不确定环境下表现更出色? 在规则之外,做好互联网,还有哪些关键秘诀? 当环境不给机会,你靠什么翻身? 本书为“互联网百晓生”曹政20多年互联网经验的总结,以严谨的逻辑思维分析个人与企业在互联网发展中的一些错误思想及做法,并给出正确解法。 从技术到商业如何实现,每个发展阶段需要匹配哪些能力、分解哪些目标、落实哪些策略都一一点出,并在......一起来看看 《你凭什么做好互联网》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试