获取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 ...
随机推荐
- FTP服务器简易有效的访问方法
访问FTP服务器传统的方法是使用专用的客户端程序,如CuteFTP,8UFTP等,也包括命令行的FTP客户端c:\windows\system32\ftp.exe程序. FTP服务器也有简易访问方法 ...
- 嵌入式 Linux 应用:概述
转载:http://www.ibm.com/developerworks/cn/linux/embed/embl/overview/index.html 从腕表到基于群集的超级计算机 在对嵌入式 ...
- c语言_帮助别人
1. /*4.找出一个二维数组中的鞍点,即该位置上的元素在该行上最大.在该列上最小,也可能没有鞍点*/ #include<stdio.h> int main() { int i,j,max ...
- IOS横竖屏控制与事件处理
公司App里面有个需求,即所有界面都是竖屏,且不允许横屏切换,唯独有一个图表界面允许横屏.那么,根据此需求处理如下: 首先,确保App本身应该允许转屏切换: 再次,我的App里面都是走UINaviga ...
- STL之heap
STL的堆操作 STL里面的堆操作一般用到的只有4个:make_heap();.pop_heap();.push_heap();.sort_heap(); 他们的头文件函数是#include < ...
- Tick and Tick
The three hands of the clock are rotating every second and meeting each other many times everyday. F ...
- 如何向Android模拟器打电话发短信
1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5 ...
- Android网络请求与解析
1.Volley和Gson结合使用——Volley适用于小型数据,多次的请求,使用Gson解析时,服务器数据的键值不能包含常用的标识符如:class.....等,这些就需要与服务端小伙伴商量 这样也可 ...
- hadoop学习记录(三)HBase基本概念
这一次开始学习HBase数据库. 我用的是VMWare + ubuntu16.04 +Hbase1.1.5 +hadoop2.6.0的组合. 经过亲自安装验证,版本间没有发生冲突,可以进行学习和开发. ...
- hdu 1892 树状数组
思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方. #include<iostream> #include<cstring> #include& ...