【问题标题】:How to find the total memory allocated by an object [duplicate]如何查找对象分配的总内存[重复]
【发布时间】:2012-05-14 15:43:14
【问题描述】:

可能重复:
In Java, what is the best way to determine the size of an object?

如果我们在一个类中创建实例变量和实例方法,那么如何找出为这个类的每个对象分配的总内存,如下所示,例如,我认为是一些变量(a,b)大小和方法区域大小(显示)。是真的吗?写在类里面的main方法区呢。

例如:

class A {  
    int a;
    float b;
    void display()
    {  
       ---
    }

    public static void main(String a[])
    { 
        A obj=new A();
    }
}

【问题讨论】:

    标签: java memory-management garbage-collection


    【解决方案1】:

    简短的回答是你不需要知道,除非你知道这是一个问题。

    更长的答案是它将使用大约 16 个字节的对象标头,每个字段 4 个字节(并将总数四舍五入到 8 个字节的边界),即 24 个字节。

    局部变量,例如引用分配在堆栈上,通常不计算在内。

    您通常不关心大小的原因是 1 MB 值得您花费大约 2 秒的时间(将内存的零售价与最低工资进行比较)这意味着您提出问题所花费的时间是值得的远远超过您可能节省的内存价值(在这种情况下)

    [一个 4 GB 模块的成本为 18 英镑,最低工资为 8.50 英镑,因此 1 GB 大约值 0.5 小时。 1 MB 大约相当于 2 秒。]

    换句话说,如果一个简单的更改不能为您节省 1 MB 的内存,您可以更好地使用它,那么您可能是在浪费时间。

    这同样适用于移动设备,但程度较小(内存成本更高,如果将其部署到数千台设备上,节省几百字节的总成本可能很重要)

    这样做的结果是,您编写 long 而不是 intdouble 而不是 float(它们都有一个额外的字符)所花费的时间可能比它使用的额外内存。但是,我仍然建议几乎总是使用 double 而不是 float,并且通常使用 long 而不是 int,因为如果它节省了一个错误,它将弥补您必须输入的额外字符。


    测量对象使用了多少空间(或创建对象使用了多少内存)的最简单方法是关闭 TLAB -XX:-UseTLAB 并测量使用运行时创建对象之前和之后的内存量.totalMemory - freeMemory。

    但是,我更愿意等到数据结构出现在像 YourKit 这样的分析器(VisualVM 是免费的)中,然后才认为这是一个问题。

    【讨论】:

      【解决方案2】:

      您可以使用 java.lang.instrumentation 包: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html

      编译这个类并将其放入一个 JAR 中:

      import java.lang.instrument.Instrumentation;
      
      public class ObjectSizeFetcher {
          private static Instrumentation instrumentation;
      
          public static void premain(String args, Instrumentation inst) {
              instrumentation = inst;
          }
      
          public static long getObjectSize(Object o) {
              return instrumentation.getObjectSize(o);
          }
      }
      

      将以下内容添加到您的MANIFEST.MF

      Premain-Class: ObjectSizeFetcher
      

      使用getObjectSize():

      public class C {
          private int x;
          private int y;
      
          public static void main(String [] args) {
              System.out.println(ObjectSizeFetcher.getObjectSize(new C()));
          }
      }
      

      使用java -javaagent:ObjectSizeFetcherAgent.jar C调用文件

      【讨论】:

      猜你喜欢
      • 2012-05-05
      • 2019-07-25
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多