我有一个应用程序可以读取包含大量数据行的 CSV 文件。我根据数据的类型给用户总结了行数,但是我想确保我没有读入太多的数据行并导致OutOfMemoryErrors。每行转换为一个对象。有没有一种简单的方法可以以编程方式找出该对象的大小?是否有一个参考定义了原始类型和对象参考的大小VM?
OutOfMemoryError
VM
现在,我的代码说 read up to 32,000 rows ,但我也希望代码说 read as many rows as possible 直到我使用了 32MB 内存。也许这是一个不同的问题,但我仍然想知道。
您可以使用该java.lang.instrument软件包。
java.lang.instrument
编译这个类并将其放入一个 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:
MANIFEST.MF
Premain-Class: ObjectSizeFetcher
使用getObjectSize()方法:
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