转载自:http://www.bitscn.com/pdb/java/200605/21194.html

Java有一个很好的地方就是java的垃圾收集机制,这个机制集成于jvm的,对程序员来说是隐藏且不透明的。这种情况下,如何得到某个对象消耗的内存呢?
  
    曾经看到过有人用以下方法来计算:在生成该object的前后都调用java.lang.Runtime.freeMemory()方法,然后看两者之差即为该object消耗的内存量。
  
    这种方法的代码是:
  
  long totalMem = java.lang.Runtime.freeMemory();
  Object myBigObject = null;
  System.out.println("You just got rid of " + totalMem
   - java.lang.Runtime.freeMemory());
  
  
  
    这种想法是对的,但是实际上,jvm的freememory往往不能正确反应实际的free memory。比如在jvm要进行垃圾收集的时候,free memory就会缩小。而如果决定垃圾收集的时间发生在该object生成之后,而在第二次调用java.lang.Runtime.freeMemory()之前,那么就会错误地增加该object消耗的内存量。
  
    在java专家By Tony Sintes的文章"Discover how much memory an object consumes " 里面提到了应该用Runtime.getRuntime().totalMemory();并且计算两次之差来得到消耗的内存量。
  
    By Tony Sintes的源代码:
  
  public class Memory {
   private final static int _SIZE = 500;
   public static void main( String [] args )
   throws Exception {
   Object[] array = new Object[_SIZE];
   Runtime.getRuntime().gc();
   long start = Runtime.getRuntime().totalMemory();
   for (int i = 0; i < _SIZE; i++) {
   array[i] = new Object();
   }
   Runtime.getRuntime().gc();
   long end = Runtime.getRuntime().totalMemory();
   long difference = ( start - end ) / _SIZE;
   System.out.println( difference + " bytes used
   per object on average" );
   }
  }
  
  
  
    实际上,这种方法基本上正确了,但是By Tony Sintes疏忽了一点,就是仅仅Runtime.getRuntime().gc();并不能真正完成垃圾收集,也就是说实际上jvm的内存此时并不是稳定的。
  
    所以,只有当内存不再发生大的变动,或者说已经稳定,我们才可能说垃圾收集已经完成。
  
    如何才能真正确保基本完成了jvm的垃圾收集呢?实现这个功能的代码如下:
  
  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 ();
   }
   }

如何计算java对象占用的内存相关推荐

  1. 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...

  2. 解析一个Java对象占用多少内存空间

    说明: alignment, 对齐, 比如8字节的数据类型long, 在内存中的起始地址必须是8的整数倍. padding, 补齐; 在对象所占据空间的末尾,如果有空白, 需要使用padding来补齐 ...

  3. java统计空间占用_如何计算Java对象占用了多少空间?

    在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小. 对象头 对象的头部至少有两个WORD, ...

  4. 2020 idea 查看内存消耗_查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况...

    一.如果想看运行时某个java对象占用JVM内存大小,可以先将对象转换成字节类型,然后计算: List bizGroupRelatedEventInfos = bizEventVersionMappe ...

  5. 如何查看java对象所占内存大小

    有时候我们需要对比看那种数据结构的Java对象占用的内存比较少,这时候我们就需要查看内存大小. 借助org.apache.lucene工具类 当一个对象有多个属性,需要计算整个对象的大小时,可以借助o ...

  6. java取得对象占用的内存大小

    本文环境 win 10 jdk 1.8.0_241 IntelliJ 2019.1.3 一.通过Instrumentation获取内存 在java工程中添加如下代理类: package com.nin ...

  7. 如何计算java对象大小

    背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000.我们的业务系统中就使用了size为10000的15个本地缓存 ...

  8. java程序占用实际内存大小

    一.java程序占用实际内存大小 1.1.java命令启动参数-Xms -Xmx的问题         启动命令如下:java -server -Xms128m -Xmx128m -jar ****. ...

  9. 1 OC 对象的本质(一个NSObject 对象占用的内存大小)

    1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...

最新文章

  1. 剖析IntentService的运作机理
  2. 图解HTTP--笔记
  3. Qt程式异常崩溃处理技巧(Win)
  4. android -------- MVP+DataBinding 的使用
  5. 搬家,又一次和过往告别
  6. 格式化输入数字_Python格式化输出的三种方式
  7. 以普通用户启动的Vim如何保存需要root权限的文件
  8. Android 数据访问之External Storage 数据保存在sd卡 demo+笔记
  9. InfoPath 发布表单到SharePoint库报错
  10. Hadoop HDFS 的 Java API 操作方式
  11. Android 硬编码
  12. 敏感性分析数学建模方法(敏感性分析数学建模模型)
  13. activity劫持反劫持
  14. 哪个Linux可以运行国服lol,Linux wine国服LOL英雄联盟,完美运行!!
  15. 多张图片怎么合成一个pdf?
  16. 附加支付和统筹支付_医保附加支付是什么意思?
  17. 在Xcode中使用C++与Objective-C混编
  18. IV 12 MySQL+drbd+heartbeat
  19. Try-with-resources are not supported at language level ‘5‘
  20. 点线面数据异常分析,鱼骨图找原因

热门文章

  1. QlikView线图高亮选择尺寸
  2. windows系统上安装与使用Android NDK r8d(二)
  3. flash我中学时的梦想
  4. D1net阅闻:Google发布了能理解人类语言的云服务
  5. Spring的cache缓存介绍
  6. Spring EL中的类操作符
  7. Samba的安装步骤
  8. Excel2007中插入页眉和页脚
  9. Android API 中文 (53) —— BaseAdapter
  10. JSpider(3):JSpider的结构