我有一个应用程序,它读取带有大量数据行的CSV文件。我根据数据类型为用户提供了行数的摘要,但是我想确保不会读入太多数据行并导致OutOfMemoryError。每行转换为一个对象。有没有一种简便的方法以编程方式找出该对象的大小?是否有一个引用定义了VM的原始类型和对象引用的大小?

现在,我的代码可以读取多达32,000行,但我还想让代码读取尽可能多的行,直到使用32MB内存为止。也许这是一个不同的问题,但我仍然想知道。

最佳答案

您可以使用java.lang.instrument package

编译该类并将其放在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

10-04 18:49