Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法
System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/
Runtime rt=Runtime.getRuntime( ); //获得系统的Runtime对象rt
System.out.println("Total Memory= " + rt.totalMemory( )+//打印总内存大小
" Free Memory = "+rt.freeMemory( )); //打印空闲内存大小
基类:
public abstract class SizeOf {
private final Runtime s_runtime = Runtime.getRuntime();
/**
*
* 子类负责覆盖该方法以提供被测试类的实例
*
* @return 被测试类的实例
*/
protected abstract Object newInstance();
/**
*
* 计算实例的大小(字节数)
*
* @return 实例所占内存的字节数
* @throws Exception
*/
public int size() throws Exception {
// 垃圾回收
runGC();
// 提供尽可能多(10万)的实例以使计算结果更精确
final int count = 100000;
Object[] objects = new Object[count];
// 实例化前堆已使用大小
long heap1 = usedMemory();
// 多实例化一个对象
for (int i = -1; i < count; ++i) {
Object object = null;
// 实例化对象
object = newInstance();
if (i >= 0) {
objects[i] = object;
} else {
// 释放第一个对象
object = null;
// 垃圾收集
runGC();
// 实例化之前堆已使用大小
heap1 = usedMemory();
}
}
runGC();
// 实例化之后堆已使用大小
long heap2 = usedMemory();
final int size = Math.round(((float) (heap2 - heap1)) / count);
// 释放内存
for (int i = 0; i < count; ++i) {
objects[i] = null;
}
objects = null;
return size;
}
private void runGC() throws Exception {
// 执行多次以使内存收集更有效
for (int r = 0; r < 4; ++r) {
_runGC();
}
}
private void _runGC() throws Exception {
long usedMem1 = usedMemory();
long usedMem2 = Long.MAX_VALUE;
for (int i = 0; (usedMem1 < usedMem2) && (i < 500); ++i) {
s_runtime.runFinalization();
s_runtime.gc();
Thread.currentThread().yield();
usedMem2 = usedMem1;
usedMem1 = usedMemory();
}
}
/**
*
* 堆中已使用内存
*
* @return 堆中已使用内存
*/
private long usedMemory() {
return s_runtime.totalMemory() - s_runtime.freeMemory();
}
}
子类:
public class SizeOfObject extends SizeOf {
@Override
protected Object newInstance() {
return new Object();
}
public static void main(String[] args) throws Exception {
SizeOf sizeOf = new SizeOfObject();
System.out.println("所占内存:" + sizeOf.size() + "字节");
}
}
输出为:所占内存:8字节
利用序列化(Serializable)计算对象的大小
下面代码可以计算session的大小:
将session中的所有对象输出到文件中,文件的大小就是对象的大小.
try {
FileOutputStream f = new FileOutputStream("c:/sessionFiles");
ObjectOutputStream s = new ObjectOutputStream(f);
s.writeObject("session:");
HttpSession session = request.getSession(false);
Enumeration names = session.getAttributeNames();
while(names.hasMoreElements()){
s.writeObject(session.getAttribute((String) names.nextElement()));
}
s.flush();
s.close();
f.close();
} catch (Exception e) {
e.printStackTrace();
}
也可以看看这个
java对象占内存大小
http://329937021.iteye.com/blog/547779
Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法相关推荐
- java 图片 内存溢出_Java修改图片尺寸,总是报内存溢出怎么解决?
项目需求:有很多尺寸很大的图片(图片大小可能几十MB,甚至上百MB),需要等比例缩小它们的尺寸,相当于生成缩略图. 例如:原图8268x6201,需要压缩成400x300. 我现在的方法:将图片整个读 ...
- java 内存类_Java学习——类的生命周期和内存
常识是本能,有足够的常识便是天才.--肖伯纳 一.类的生命周期 类的生命周期:1.加载:将二进制流加载进来.class 2.连接: 验证:确保加载进来的数据不会损害虚拟机 准备:为类变量分配内存,附默 ...
- java 字符串排列组合_Java 程序计算列出字符串的所有排列组合
Java 程序计算列出字符串的所有排列组合 在此示例中,我们将学习计算Java中字符串的所有排列组合. 要理解此示例,您应该了解以下Java编程主题: 字符串的排列是指可以通过互换字符串字符的位置来形 ...
- java 求商_Java程序计算商和余数
Java程序计算商和余数 在该程序中,您将学习从Java中给定的被除数和除数计算商和余数. 示例:计算商和余数 public class QuotientRemainder { public stat ...
- Java教程交集_Java 程序计算两个集合的交集
Java 程序计算两个集合的交集 在此示例中,我们将学习计算Java中两个集合的交集. 要理解此示例,您应该了解以下Java编程主题: 示例1:计算两个集合的交集 示例import java.util ...
- 分页池内存持续增长_Java技术学习之对虚拟机(JVM)内存模型的分析
JVM会将Java进程所管理的内存划分为若干不同的数据区域,这些区域有各自的用途.创建/销毁时间. JVM内存数据:栈管运行,堆管存储 第一章 线程私有区域 线程私有数据区域生命周期与线程相同, 依赖 ...
- arthas 排查内存溢出_Java程序线上故障排查
这篇文章是在公司做了不少的线上Java服务故障排查和优化之后的一个总结,可以作为一个工具清单,在分析问题的时候需要有整体思路:全局观,先从系统层面入手,大致定位方向(内存,cpu,磁盘,网络),然后再 ...
- java引用静态方法会实例化类吗_Java系列之:看似简单的问题 静态方法和实例化方法的区别...
今天看书时一直没真正弄明白静态方法和实例方法的区别,就在网上搜索,找到一篇很好的文章,和大家分享一下: 这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方 ...
- java中怎么让一个数倒转_java 输入一个数字,反转输出这个数字的值(实现方法)
java 输入一个数字,反转输出这个数字的值(实现方法) 如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public ...
最新文章
- 腾讯裁撤中层干部,拥抱年轻人
- EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心
- python获取中文字体点阵坐标_点阵汉字显示 - freecamel的个人空间 - OSCHINA - 中文开源技术交流社区...
- JS特效——鼠标跟随特效——动态背景线条跟随鼠标移动
- 企业dns 服务器的搭建
- iOS开发--地图与定位
- sql相同顺序法和一次封锁法_数学专题 | Ep01 隔板法的妙用
- ElasticSearch之 控制相关度原理讲解
- java 利用Future异步获取多线程任务结果
- 通过批处理来运行python程序
- [原创]性能测试工程师试题
- C/C++[指针/引用]
- win安装appium
- 串口IEC103协议
- latex数学符号加粗_LaTex数学公式符号整理
- java计算base64图片大小
- 网站搭建:从零搭建个人网站教程(10)
- python获取北京时间_python获取标准北京时间的方法
- 电影《海贼王:红发歌姬》观后感
- 处理Nginx返回octet-stream数据流的配置
热门文章
- python基础30个常用代码大全-Python3列表内置方法大全及示例代码小结
- 普通人有必要学python-风变编程:普通人学Python有意义吗?
- python3.5怎么安装pip-python3.5.2安装pip管理工具
- 电脑python下载-Python3.9官方下载
- python怎么检查错误-错误处理
- python基础教程第四版-python基础教程第4版pdf
- 以下哪个不是python中的关键字-以下哪个选项不是Python语言的保留字
- python人脸识别毕业设计-基于Python的人脸识别系统研究.docx
- python下载教程1001python下载教程-1001种玩法 | Python 学习指南资源
- python基础知识ppt-python入门ppt下载