大量のデータ行を含む CSV ファイルを読み取るアプリケーションがあります。データのタイプに基づいて行数の概要をユーザーに提供しますが、読み取りデータ行数が多すぎて が発生しないようにする必要がありますOutOfMemoryError
。各行はオブジェクトに変換されます。そのオブジェクトのサイズをプログラムで確認する方法はありますか? プリミティブ型とオブジェクト参照が に対してどのくらいの大きさであるかを定義する参照はありますかVM
?
現在、最大32,000 行を読み取るというコードがありますが、 32 MBのメモリを使用するまで、できるだけ多くの行を読み取るというコードも必要です。
ベストアンサー1
あなたは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
:
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