原 荐 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

没有更多内容

加载失败,请刷新页面

加载更多

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

查看所有标签

猜你喜欢:

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

PCI Express 体系结构导读

PCI Express 体系结构导读

王齐 / 机械工业 / 2010-3 / 55.00元

《PCI Express 体系结构导读》讲述了与PCI及PCI Express总线相关的最为基础的内容,并介绍了一些必要的、与PCI总线相关的处理器体系结构知识,这也是《PCI Express 体系结构导读》的重点所在。深入理解处理器体系结构是理解PCI与PCI Express总线的重要基础。 读者通过对《PCI Express 体系结构导读》的学习,可超越PCI与PCI Express总线......一起来看看 《PCI Express 体系结构导读》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

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

正则表达式在线测试