新建一个maven工程

我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图:

在maven项目中的pom.xml中新增一个打jar包的插件,如下:

org.apache.maven.plugins

maven-compiler-plugin

3.1

1.8

1.8

/src/test/**

utf-8

org.apache.maven.plugins

maven-jar-plugin

3.0.2

${project.build.outputDirectory}/META-INF/MANIFEST.MF

在项目的resources中新建一个名为META-INF的目录,在这个目录下新建一个名为MANIFEST.MF的属性文件,如下图:

项目的JDK设置为1.8,如下图:

编写获取Java对象内存的工具方法

import java.lang.instrument.Instrumentation;

import java.lang.reflect.Array;

import java.lang.reflect.Field;

import java.lang.reflect.Modifier;

import java.util.ArrayDeque;

import java.util.Deque;

import java.util.HashSet;

import java.util.Set;

public class ObjectSizeFetcher {

// instrumentation 是一个 java.lang.instrument.Instrumentation 的实例,由 JVM 自动传入

private static Instrumentation instrumentation;

/**

* 这个方法先于主方法(main)执行

* @param args

* @param inst

*/

public static void premain(String args, Instrumentation inst) {

instrumentation = inst;

}

/**

* 直接计算当前对象占用空间大小,包括当前类及超类的基本类型实例字段大小、

* 引用类型实例字段引用大小、实例基本类型数组总占用空间、实例引用类型数组引用本身占用空间大小;

* 但是不包括超类继承下来的和当前类声明的实例引用字段的对象本身的大小、实例引用数组引用的对象本身的大小

*

* @param o 需要计算内存的对象

* @return 返回内存大小

*/

public static long sizeOf(Object o) {

return instrumentation.getObjectSize(o);

}

/**

* 递归计算当前对象占用空间总大小,包括当前类和超类的实例字段大小以及实例字段引用对象大小

* 注意:这个方法如果你看不懂也没关系,会用就行

*

* @param objP

* @return

* @throws IllegalAccessException

*/

public static long fullSizeOf(Object objP) throws IllegalAccessException {

Set visited = new HashSet();

Deque toBeQueue = new ArrayDeque<>();

toBeQueue.add(objP);

long size = 0L;

while (toBeQueue.size() > 0) {

Object obj = toBeQueue.poll();

//sizeOf的时候已经计基本类型和引用的长度,包括数组

size += skipObject(visited, obj) ? 0L : sizeOf(obj);

Class> tmpObjClass = obj.getClass();

if (tmpObjClass.isArray()) {

//[I , [F 基本类型名字长度是2

if (tmpObjClass.getName().length() > 2) {

for (int i = 0, len = Array.getLength(obj); i < len; i++) {

Object tmp = Array.get(obj, i);

if (tmp != null) {

//非基本类型需要深度遍历其对象

toBeQueue.add(Array.get(obj, i));

}

}

}

} else {

while (tmpObjClass != null) {

Field[] fields = tmpObjClass.getDeclaredFields();

for (Field field : fields) {

if (Modifier.isStatic(field.getModifiers()) //静态不计

|| field.getType().isPrimitive()) { //基本类型不重复计

continue;

}

field.setAccessible(true);

Object fieldValue = field.get(obj);

if (fieldValue == null) {

continue;

}

toBeQueue.add(fieldValue);

}

tmpObjClass = tmpObjClass.getSuperclass();

}

}

}

return size;

}

/**

* String.intern的对象不计;计算过的不计,也避免死循环

*

* @param visited

* @param obj

* @return

*/

static boolean skipObject(Set visited, Object obj) {

if (obj instanceof String && obj == ((String) obj).intern()) {

return true;

}

return visited.contains(obj);

}

}

计算一个对象的大小

我们在项目工程中新建一个名为Point的类,然后写一个main方法来测试new Point()占用内存空间的大小,代码如下:

public class Point {

private int x;

private int y;

public static void main(String [] args) {

System.out.println(ObjectSizeFetcher.sizeOf(new Point()));

}

}

我们在文件resources/META-INF/MANIFEST.MF中新增如下一行属性配置:

Premain-Class: com.twq.ObjectSizeFetcher

maven打包,如下:

打开操作系统的cmd,进入到上面的jar包所在的目录,如下图:

执行如下的命令:

java -javaagent:ObjectSizeFetcherAgent-1.0-SNAPSHOT.jar Point

得到的结果如下:

复杂Java对象所占内存的大小

我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...

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

[ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖:

一个Java对象到底占多大内存

最近在读,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

一个Java对象到底占多大内存?(转)

最近在读,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

【转】一个Java对象到底占多大内存?

最近在读,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

获取JAVA对象占用的内存大小

介绍两种获取JAVA对象内存大小的方法. 第一种:Instrumentation 简介: 使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小.利用I ...

JAVA数组所占内存大小的对比

1.两个数据模型 第一个是基本类型数组,第二个使用的是Float对象数组 public class SummaryModel{ private float[] summaryData; public ...

一个 Java 对象到底有多大?

阅读本文大概需要 2.8 分钟. 出处:http://u6.gg/swLPg 编写 Java 代码的时候,大多数情况下,我们很少关注一个 Java 对象究竟有多大(占据多少内存),更多的是关注业务与逻 ...

java中基本类型封装对象所占内存的大小&lpar;转&rpar;

这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runt ...

随机推荐

嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

/*************************************************************************************************** ...

Uestc&lowbar;suibian 暑假集训总结

唉,终于组队了,终于可以只BB了,我就BB,我就不上! 和Xiper以及chenxh组队了- 下面是总结: day1 第一天吃饱喝足,然后就上路了,我一开始就看到了C题大水题,但是我不敢想象这道题居然 ...

&lpar;三大框架SSH&rpar;面试题锦集

http://www.cnblogs.com/dieyf/p/4109233.html

Blue Jeans&lpar;串&rpar;

Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10083   Accepted: 4262 Description The ...

(转载)PHP怎么获取MySQL执行sql语句的查询时间

(转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...

ASIHttpRequest:创建队列、下载请求、断点续传、解压缩

ps:本文转载自网络:http://ryan.easymorse.com/?p=12 感谢作者 工程完整代码下载地址:RequestTestDownload1 可完成: 下载指定链接的zip压缩文件 ...

C&plus;&plus; 哈希表 &lpar;hashtable&rpar; 用于保存简单的数据,及数据查找,数据删除

/*hashtable.h*/ #include #include #include using namesp ...

Java之路——Java初接触

本文大纲 1.Java是什么 2.Java历史 3.Java技术范围 3.1 Java SE平台技术范围 3.2 Java EE技术范围 3.3 Java 体系技术范围 4.总结 1.Java是什么 ...

java 源码编译

Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(叫“编译器的前段”更准确)——把*.java文件转变成*.class文件的过程:也可能是虚拟机的后端运行期编译器( ...

rhel 配置centos源

1.删除自带的yum包,清除/etc/yum.repos.d下面的文件 rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依赖,直接删除rpm包) 2.安装cento ...

java 打印对象大小_如何获取一个Java对象所占内存大小相关推荐

  1. 获取内存_如何获取一个进程所占用的内存

    推荐观看: BATJ面试官最喜欢问的:多线程.线程并发面试题详解(volatile+ThreadLocal+Sleep)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili. ...

  2. java控制台输入汉字_给我一个JAVA控制台输入中文的实例

    给我一个JAVA控制台输入中文的实例 关注:205  答案:3  mip版 解决时间 2021-01-27 14:43 提问者葃日懙妳 2021-01-26 20:40 越简单越好,就是运行之后出了控 ...

  3. Java FX8_第一篇_编写第一个Java FX Application

    所有的Java FX程序必须继承自Application类且必须覆写start( )方法,而start ( )方法的参数是一个stage(继承Application类且使用Stage类必须导入java ...

  4. java查看对象地址_如何获取到JAVA对象所在的内存地址

    展开全部 1.首先打开java构造方法代码. 2.接下来就可以获得网卡物理地址方法代码. 3.然32313133353236313431303231363533e4b893e5b19e31333431 ...

  5. java z注释过滤_如何编写一个java程序来过滤所有注释行并只打印java编码行?

    使用 javaparser,您可以解决此问题,如此PoC中所示. RemoveAllComments import japa.parser.JavaParser; import japa.parser ...

  6. python判断对象类型_如何查看一个Python对象的类型

    怎么查看一个对象的类型 在Python中有两种类型判断函数,type()和isinstance(). 使用type() 首先,我们来判断对象类型,使用type()函数: 基本类型都可以用type()判 ...

  7. java输入学生信息_要求编写一个java程序,输入学生信息,并能保存与显示学生信息。...

    Java 代码如下:import java.util.ArrayList; import java.util.Scanner;public class student{ private int num ...

  8. Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法

    System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/ Runtime rt=Runtime.get ...

  9. C++_类和结构体所占内存大小,静态成员问题

    C++_类和结构体所占内存大小,静态成员问题 静态成员未初始化或者未调用(当然静态成员必须类外初始化才能调用)是不占内存的.静态成员不占类或结构体的内存 静态成员函数同样只声明未定义同样不占内存 指针 ...

  10. 将对象mock填充数据 获取json格式对象,便于文档编辑

    将对象mock填充数据 获取json格式对象,便于文档编辑 <!--mock数据 java对象转json--><dependency><groupId>com.gi ...

最新文章

  1. 根据声音信号测量距离
  2. js自定义类,混合的构造函数/原型方式
  3. 中国海洋生物医药产业专项应用调研及战略展望规划分析报告2021-2027年
  4. juniper接口打环测试
  5. 广告中oCPX到底是如何进行优化的?
  6. HDOJ 1247 HDU 1247 Hat’s Words ACM 1247 IN HDU
  7. 换脸系列——整脸替换
  8. oauth 使用令牌_使用OAuth2令牌的安全REST服务
  9. mysql主从复制 lvs+ keepalived
  10. Angular4.x+Ionic3 踩坑之路之打包时出现JAVASCRIPT HEAP OUT OF MEMORY的几种解决办法
  11. nodejs安装服务器系统,window下,nodejs安装http-server,并开启HTTP服务器
  12. CentOS使用NTFS-3G加载NTFS硬盘
  13. 计算机一级b考试电子表格,计算机等级考试一级B第1-50套题
  14. Android视频加密
  15. 系统操作手册_辽宁高考志愿填报系统2019操作手册(考生版)
  16. 51单片机定时器时间计算
  17. 机器学习练习 6 - Support Vector Machines(支持向量机)
  18. 在图3-30 中,某学院的以太网交换机有三个接口分别和学院三个系的以太网相连,另外三个接口分别和电子邮件服务器、万维网服务器以及一个连接互联网的路由器相连。图中的A,B和C都是100Mbit/s以太网
  19. 一文带你看懂TCP/IP协议 (更新中 现更新至网络层部分)
  20. 安装程序无法继续因为计算机上安,Windows安装无法继续怎么办?Windows安装无法继续的解决方法...

热门文章

  1. FusionComputer密码修改
  2. 数据库驱动加载失败,数据库连接失败
  3. 【bzoj4011】【HNOI2015】落忆枫音【树形DP】
  4. **一些常用的字体英文名**
  5. windows下谷歌邮箱注册及谷歌浏览器登录
  6. Wordpress主题制作基础教程
  7. 如何在word中的图片上画圈标注_word图片上画圈 如何在word图片中进行画圈标示...
  8. 简易计算机系统综合设计--函数发生器
  9. 【LeetCode每日一题】633. 平方数之和
  10. C#ObjectArx Cad添加图层