在Java中没有sizeof运算符。我如何找到一个对象的大小?

14 浏览
0 Comments

在Java中没有sizeof运算符。我如何找到一个对象的大小?

可能的重复问题:\n- 编程计算Java对象占用的内存大小,包括引用的对象\n- 在Java中,如何确定对象的大小?\n你好\n在Java中没有sizeof运算符...\n但是我如何知道一个对象的大小?\n谢谢

0
0 Comments

在Java中,没有直接的方法来获取一个对象的大小。而且,由于规范对实现细节没有明确说明,不同的Java虚拟机(JVM)可能会有不同的答案。不过,我们可以通过一些方法来近似地获取对象的大小。

这篇优秀的文章介绍了一种方法,可以通过计算对象的字段大小来估计对象的大小。具体做法如下:

1. 遍历对象的所有字段,包括实例字段和继承自父类的字段。

2. 对于每个字段,根据其类型来计算所占的字节数。例如,一个`int`类型的字段占4个字节,一个`double`类型的字段占8个字节。

3. 将所有字段的字节数相加,即可得到对象的近似大小。

以下是一个示例代码,演示了如何使用这种方法来估计对象的大小:

public class ObjectSizeEstimator {
    public static long getObjectSize(Object obj) {
        long size = 0;
        // 遍历对象的所有字段
        for (Field field : obj.getClass().getDeclaredFields()) {
            // 设置字段可访问(如果字段是私有的)
            field.setAccessible(true);
            // 根据字段的类型来计算所占的字节数
            if (field.getType().equals(boolean.class) || field.getType().equals(byte.class)) {
                size += 1;
            } else if (field.getType().equals(char.class) || field.getType().equals(short.class)) {
                size += 2;
            } else if (field.getType().equals(int.class) || field.getType().equals(float.class)) {
                size += 4;
            } else if (field.getType().equals(double.class) || field.getType().equals(long.class)) {
                size += 8;
            } else if (field.getType().isReference()) {
                size += 4; // 对象引用占4个字节
            }
        }
        return size;
    }
}

通过调用`getObjectSize`方法并传入对象,即可获取该对象的近似大小。

需要注意的是,这种方法只能作为一个估计,不能完全准确地获取对象的大小。另外,不同的JVM可能会有不同的实现,因此获取的大小可能会有所差异。但是,对于大多数应用场景而言,这种估计已经足够使用了。

0
0 Comments

在Java中没有sizeof运算符,因此无法直接获取对象的大小。这是因为对象的内部表示是与Java虚拟机(JVM)相关的,不同的JVM实现可能有不同的内存布局和对象表示方式。但是,如果想要获得对于特定JVM的对象大小的经验估计,可以尝试以下方法:

1) 打开详细垃圾收集器输出(参见JVM标志)

2) 在程序中调用一次完整的垃圾收集(full GC)

3) 创建大量相同对象的副本

4) 再次调用一次完整的垃圾收集(full GC)

5) 比较步骤2和步骤4后的堆大小,并将其除以对象的数量,即可得到每个对象的大小的估计值。

以下是一个示例代码,演示了如何通过这种方式估计对象的大小:

public class ObjectSizeEstimator {
    public static void main(String[] args) {
        // Turn on verbose garbage collector output
        System.out.println("Running garbage collector");
        System.gc();
        // Invoke a full GC
        System.out.println("Running full garbage collector");
        System.gc();
        // Create a lot of copies of the same object
        int numCopies = 1000000;
        Object obj = new Object();
        Object[] copies = new Object[numCopies];
        for (int i = 0; i < numCopies; i++) {
            copies[i] = new Object();
        }
        // Invoke a full GC again
        System.out.println("Running full garbage collector again");
        System.gc();
        // Compare heap size before and after and calculate object size estimate
        long heapSizeBefore = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("Heap size before: " + heapSizeBefore);
        System.gc();
        long heapSizeAfter = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("Heap size after: " + heapSizeAfter);
        long objectSizeEstimate = (heapSizeAfter - heapSizeBefore) / numCopies;
        System.out.println("Object size estimate: " + objectSizeEstimate);
    }
}

0
0 Comments

在Java中没有sizeof运算符。那么在Java中如何获取对象的大小呢?

一个解决方法是将对象序列化为字节数组输出流。这样做不能准确地得到对象的大小,因为它会跳过transient数据,但至少可以给你一个对象大致的大小。

下面是一个示例代码:

import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
public class ObjectSizeUtil {
    public static int getObjectSize(Object obj) {
        try {
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            ObjectOutputStream objectOut = new ObjectOutputStream(byteOut);
            objectOut.writeObject(obj);
            objectOut.flush();
            objectOut.close();
            return byteOut.toByteArray().length;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
}

你可以使用上面的getObjectSize方法来获取一个对象的大小。只需要将待测量大小的对象作为参数传递给getObjectSize方法即可。该方法将返回对象的大小(以字节为单位),如果出现异常则返回-1。

希望这个方法能帮助你解决问题!

0