java - Java中如何确定对象的大小

标签 java memory

我有一个应用程序可以读取包含大量数据行的 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

关于java - Java中如何确定对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60847731/

相关文章:

java - 以同样的方式对2个数组进行排序

c++ - Eigen 与 -O3 警告 : argument 1 value ‘X’ exceeds maximum object size Y

java - J2me应用程序多次播放文件内存不足异常

c - 动态库实际上在内存中的什么位置?

python - 如何在python中打印出对象的内存内容?

java - 从 JNI 中编码数据的最快方法是什么

java - 在程序加载之前检查文件

java - 非常基本的 OrientDB/TinkerPop 属性图数据库问题

java - 如何使用索引提示选项查询

c++ - 关于循环变量优化的标准合规行为是什么?