String メンバーを Java クラスにドロップすると、たとえ String が空であっても、「24 バイト」を支払うことになると同僚が言っているのを聞きました。それは正確ですか?Integer、Float、Doubleでも同じですか?(int、float、double とは対照的に、それぞれ 4、4、8 バイトしかありません)。
4 に答える
参照用に 4 または 8 バイトを支払う必要があります。「コンテナ」オブジェクトのインスタンスごとに追加のオブジェクトを支払うかどうかは、空の文字列を取得する方法によって異なります。たとえば、リテラルを使用すると""
、すべてのインスタンスが同じオブジェクトを参照するため、参照自体に対してのみ支払う必要があります。
インスタンスごとに個別の空の文字列を作成している場合、明らかにより多くのメモリが必要になります。
この回答から借用: プログラムは、空の文字列に対して 32 バイトを出力します (文字列プールにある "" に対しては 0 を出力します)。
public static void main(String... args) {
long free1 = free();
String s = "";
long free2 = free();
String s2 = new String("");
long free3 = free();
if (free3 == free1) System.err.println("You need to use -XX:-UseTLAB");
System.out.println("\"\" took " + (free1 - free2) + " bytes and new String(\"\") took " + (free2
- free3) + " bytes.");
}
private static long free() {
return Runtime.getRuntime().freeMemory();
}
整数よりも整数の方がはるかに多く支払うことになるのは事実です。いくつかのJavaバージョンを確認したことを覚えていますが、整数は約24バイト多くかかりました。文字列がnullオブジェクト(別名何もない)を指している限り、ポインタをメモリに保持しているだけであり、JVMがそれを初期化する場所を保持するとは思わない。その場合はそうではない。 24バイト、わずか8を無駄にします。ただし、文字列を作成すると(空の文字列 ""でも)、すでにメモリ内にオブジェクトがあり、すべてのオブジェクトはObjectを継承するため、手荷物が発生し、直感的に予想されるよりも多くのメモリを消費します。 。文字列の使用法に応じて、一般的な解決策はnullオブジェクトから開始し、必要なときにそれを遅延初期化することです。