获取JAVA对象占用的内存大小
介绍两种获取JAVA对象内存大小的方法。
第一种:Instrumentation
简介:
使用java.lang.instrument 的Instrumentation来获取一个对象的内存大小。利用Instrumentation并且通过代理我们可以监测在JVM运行的程序的功能,它的原理是修改方法的字节码。
package com.dingtongblog.size;
import java.lang.instrument.Instrumentation; public class ObjectSize {
private static volatile Instrumentation instru; public static void premain(String args, Instrumentation inst) {
instru = inst;
} public static Long getSizeOf(Object object) {
if (instru == null) {
throw new IllegalStateException("Instrumentation is null");
}
return instru.getObjectSize(object);
}
}
Premain-Class:com.dingtongblog.size.ObjectSize
java -cmf manifest.txt simpleSize.jar com/dingtongblog/size/ObjectSize.class
运行
-javaagent:jarpath[=options]
java -javaagent:simpleSize.jar TestMain
(当前TestMain和simpleSize.jar在同一目录下)
测试代码如下:
import com.dingtongblog.size.ObjectSize;
public class TestMain {
public static void main(String[] args) {
String a = new String(aa);
System.out.println(ObjectSize.getSizeOf(a));
} }
-javaagent:D:\sizeofag.jar
测试代码:
public class TestMain {
public static void main(String[] args) throws IllegalAccessException {
String a = new String(aa);
System.out.println(SizeOfAgent.fullSizeOf(a));
System.out.println(SizeOfAgent.sizeOf(a));
}
可以看到输出的结果40,24
jmap -histo <pid> (pid为当前JAVA进程的id)
jmap -histo 20230
jmap -dump:format=b,file=<filename>
可以把java的堆以hprof 二进制格式输出到一个文件中,然后通过jhat命令来查看,jhat会生成一个页面,能比较直观的查看堆详情。但是jhat需要的内存空间为dump文件的几倍,如果dump文件比较大会遇到OOM错误,这时候可以通过MAT来浏览堆信息。
jmap -dump:format=b,file=d:\dump.txt
jhat filename ;
(filename为之前dump出来的文件) 会解析JAVA 堆的DUMP文件并且会启动一个web服务器,服务器的默认端口为7000,命令执行完之后就可以通过127.0.0.1:7000访问堆详情了。
jhat d:\dump.txt

获取JAVA对象占用的内存大小的更多相关文章
- 4种方法教你如何查看java对象所占内存大小
摘要:本文讲述4种查看java对象所占内存大小的方法 本文分享自华为云社区<查看java对象所占内存大小>,作者:xiewenci. 计算java对象所占内存大小 1.使用jdk8自带AP ...
- 如何获取一个Java对象所占内存大小
新建一个maven工程 我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图: 在maven项目中的pom.xml中新增一个打jar包的插件,如下: &l ...
- Java程序占用实际内存大小
很多人错误的认为运行Java程序时使用-Xmx和-Xms参数指定的就是程序将会占用的内存,但是这实际上只是Java堆对象将会占用的内存.堆只是影响Java程序占用内存数量的一个因素.要更好的理解你的J ...
- 如何计算Java对象所占内存的大小
[ 简单总结: 随便一个java项目,引入jar包: lucene-core-4.0.0.jar 如果是 maven项目,直接用如下依赖: <dependency> <groupId ...
- 复杂Java对象所占内存的大小
我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算.那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承.复合的对象称为复杂对象 继承对象 class P ...
- Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): ...
- 【OC底层】一个OC对象占用多少内存?
查看一个NSObject对象占用多少内存 1.引入头文件: #import <objc/runtime.h> #import <malloc/malloc.h> 2.代码如下: ...
- java.lang.instrument: 一个Java对象占用多少字节?
一.对象头包括两部分信息:Mark Word(标记字段)和 Klass Pointer(类型指针) 1. Mark Word 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年 ...
- 探索一个NSObject对象占用多少内存?
1 下面写代码测试探索NSObject的本质 Objective-C代码,底层实现其实都是C\C++代码 #import <Foundation/Foundation.h> int mai ...
随机推荐
- PureCSS框架
http://www.tuicool.com/articles/iyiI32 Pure中的主要组件包括: 一个响应式网格,可根据需求定制. 一个基于 Normalize.css 的基础库,用于修复跨浏 ...
- linux-阿里云ECS部署PPTP(centos)
请参考以下步骤:(centos6.5中测试通过) 1.服务器端安装软件 1.1 首先安装ppp,命令: [root@test ~]#yum install -y ppp 提示Complete! ,表示 ...
- [改善Java代码]强制声明泛型的实际类型
Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. import java.util.Ar ...
- [未完成]关于Maven的使用总结
什么是maven 翻译为“专家”,“内行” Maven是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 什么是理想的项目构建? 高度自动化,跨平台,可重用的组件, ...
- 转:android 设计模式合集
转: http://mobile.51cto.com/android-419145.htm
- CSS3 垂直树状图——运用 :before 和 :after
直接上图(原网址),还有步骤想详解视频.自己CSS3练习demo. [demo] [HTML] <div class="tree"> <ul> <li ...
- Redis 命令 - Keys
DEL key [key ...] Delete a key 127.0.0.1:6379> SET foo hello OK 127.0.0.1:6379> DEL foo hello ...
- Android之线程终止
Hanlder是线程与Activity通信的桥梁,利用handler接收到任务线程,放到任务队列里面派对执行. 1.初始化的时候,定义启动的线程为一个守护线程,这样当主线程消亡掉的时候,其他线程也会被 ...
- JQuery Mobile页面加载处理
在弄移动Web时采用了JQueryMobile框架. 奇怪的是 在使用页面加载 时 事件无效 我尝试了两种方法: $(document).ready(function(){ //do events } ...
- win7 服务详解-系统优化
Adaptive Brightness监视氛围光传感器,以检测氛围光的变化并调节显示器的亮度.如果此服务停止或被禁用,显示器亮度将不根据照明条件进行调节.该服务的默认运行方式是手动,如果你没有使用触摸 ...