选择显示字体大小

如何实时得到java object占用的空间

   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 + &quot; bytes used per object on
average&quot; );
    }
}
       实际上,这种方法基本上正确了,但是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 ();
         }
     }

       rungc()可以帮我们真正的确定完成垃圾收集(准确的说,应该说是基本上完成)。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons