如何找到分配给对象的总内存

38 浏览
0 Comments

如何找到分配给对象的总内存

这个问题已经有了答案

可能是重复的问题:

在Java中,确定对象大小的最佳方法是什么?

如果我们在一个类中创建实例变量和实例方法,那么如何找出为该类的每个对象分配的总内存大小,例如下面的例子,我认为它是变量 (a,b) 大小和方法区域大小(display)的总和。是真的吗?写在类内部的主方法区域怎么样。

例如:

class A {  
    int a;
    float b;
    void display()
    {  
       ---
    }
    public static void main(String a[])
    { 
        A obj=new A();
    }
}

admin 更改状态以发布 2023年5月23日
0
0 Comments

可以使用java.lang.instrumentation 包:\nhttp://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/Instrumentation.html\n编译并将该类放入JAR包中:\n

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

\n将以下代码添加到您的MANIFEST.MF中:\n

Premain-Class: ObjectSizeFetcher

\n使用getObjectSize():\n

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

\n通过java -javaagent:ObjectSizeFetcherAgent.jar C来调用该文件。

0
0 Comments

简单的回答是,除非你知道存在问题,否则你不需要知道。

更详细的回答是,它将使用对象头约16字节,每个字段使用4字节(并将总和舍入到8字节边界),即24字节。

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

你通常不需要关注内存大小的原因是,1 MB花费约为你2秒的时间(根据内存的零售价格与最低工资比较)。这意味着提出问题所需的时间远比你可能节省的内存价值更高(在这种情况下)。

[4GB模块的成本为18英镑,最低工资为8.5英镑,因此1GB价值约为0.5小时。 1MB价值约为2秒。]

换句话说,如果简单的更改不能节省1 MB的内存,而你还有更好的用途,那么你可能在浪费时间。

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

这样做的一个后果是,你将 long 替换为 intdouble 替换为 float (它们都有一个额外的字符)所花费的时间可能比使用额外内存的时间高数千倍。然而,我仍然建议几乎总是使用 double 而不是 float,经常使用 long 而不是 int,因为如果它可以避免一个 bug,那么你要打的额外字符将会超额弥补。


衡量一个对象使用多少空间(或创建一个对象所需的内存量)的最简单方法是关闭 TLAB -XX:-UseTLAB ,并测量对象创建之前和之后的内存量,使用 Runtime.totalMemory-freeMemory。

然而,在数据结构在 YourKit(VisualVM是免费的)这样的分析工具中出现之前,我更喜欢等待才会认为是一个问题。

0