计算Java对象占用的内存

今天验证了个曾困惑我一段时间的小问题,代码简单不做过多介绍了

 

public   class  Test {
    
private   static   final  Runtime s_runtime  =  Runtime.getRuntime();

    
private   static   long  usedMemory() {
        
return  s_runtime.totalMemory()  -  s_runtime.freeMemory();
    }

    
private   static   void  runGC()  throws  Exception {
        
long  usedMem1  =  usedMemory(), 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();
        }
    }

    
public   static   void  main(String[] args)  throws  Exception {
        System.out.println(Test.usedMemory());
        
for  ( int  i  =   0 ; i  <   1000 ; i ++ ) {
            A a 
=   new  A();
           //B b = new B();
        }
        System.out.println(Test.usedMemory());
        Test.runGC();
        System.out.println(Test.usedMemory());
    }
}

class  A {
    
private  String a;
    
private  String b;
    
private  String c;
    
private  String d;
    
private  String e;
    
private  String f;
    
private  String g;
    
private  String h;
    
private  String i;
    
private  String j;
}

class  B {
    
private  String a;
    
private  String b;
    
private  String c;
    
private  String d;
    
private  String e;
    
private  String f;
    
private  String g;
    
private  String h;
    
private  String i;
    
private  String j;

    
public  String getA() {
        
return  a;
    }

    
public   void  setA(String a) {
        
this .a  =  a;
    }

    
public  String getB() {
        
return  b;
    }

    
public   void  setB(String b) {
        
this .b  =  b;
    }

    
public  String getC() {
        
return  c;
    }

    
public   void  setC(String c) {
        
this .c  =  c;
    }

    
public  String getD() {
        
return  d;
    }

    
public   void  setD(String d) {
        
this .d  =  d;
    }

    
public  String getE() {
        
return  e;
    }

    
public   void  setE(String e) {
        
this .e  =  e;
    }

    
public  String getF() {
        
return  f;
    }

    
public   void  setF(String f) {
        
this .f  =  f;
    }

    
public  String getG() {
        
return  g;
    }

    
public   void  setG(String g) {
        
this .g  =  g;
    }

    
public  String getH() {
        
return  h;
    }

    
public   void  setH(String h) {
        
this .h  =  h;
    }

    
public  String getI() {
        
return  i;
    }

    
public   void  setI(String i) {
        
this .i  =  i;
    }

    
public  String getJ() {
        
return  j;
    }

    
public   void  setJ(String j) {
        
this .j  =  j;
    }
}

 执行了n次结果如下

a结果
201640
245512
136040或136200


b结果
201640
247192
136200

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值