Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 280|回复: 0

[默认分类] 查看java对象占堆内存多少个字节

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-15 16:26:39 | 显示全部楼层 |阅读模式



    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 = 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 = 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();     
         }     
    }   


    class Person{


    int num;
    static  long l;
    }


    public class Test extends SizeOf {  
       
         @Override  
         protected Object newInstance() {  


             return new Person();  
         }  
       
         public static void main(String[] args) throws Exception {  
             SizeOf sizeOf = new Test();  
             System.out.println("所占堆内存:" + sizeOf.size() + "字节");  
         }  
    }  







    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-30 03:35 , Processed in 0.371765 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表