0

文字列の代わりにバイト[]を使用するとメモリを節約できる複数の場所でそれを読みました。jolを使用してテストしたかったのです。

ここで私のテスト:

public static void main (String[] args) throws java.lang.Exception{
    System.out.println(VMSupport.vmDetails());
    String StrByte   = GraphLayout.parseInstance(sizeOfStrByteMap(100000)).toFootprint();
    String ByteByte = GraphLayout.parseInstance(sizeOfByteByteMap(100000)).toFootprint();
    String StrStr     = GraphLayout.parseInstance(sizeOfStrStrMap(100000)).toFootprint();
    System.out.println(StrByte);
    System.out.println(ByteByte);
    System.out.println(StrStr);
}

public static HashMap<String, String> sizeOfStrStrMap(int size) {
    String value = "this is the sample value";

    HashMap<String, String> map = new HashMap<>();
    for (int i = 0; i < size; i++) {
        map.putIfAbsent(Integer.toString(i), value);
    }
    return map;
}

public static HashMap<String, byte[]> sizeOfStrByteMap(int size) {
    byte[] value = "this is the sample value".getBytes();

    HashMap<String, byte[]> map = new HashMap<>();
    for (int i = 0; i < size; i++) {
        map.putIfAbsent(Integer.toString(i), value);
    }
    return map;
}

public static HashMap<byte[], byte[]> sizeOfByteByteMap(int size) {
    byte[] value = "this is the sample value".getBytes();

    HashMap<byte[], byte[]> map = new HashMap<>();
    for (int i = 0; i < size; i++) {
        map.putIfAbsent(Integer.toString(i).getBytes(), value);
    }
    return map;
}

ここに私の結果があります:

Running 64-bit HotSpot VM.
Using compressed oop with 3-bit shift.
Using compressed klass with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

// StrByteMap
java.util.HashMap@15327b79d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1       184       184   [B
    100000        31   3120000   [C
         1   1048592   1048592   [Ljava.util.HashMap$Node;
    100000        24   2400000   java.lang.String
         1        48        48   java.util.HashMap
    100000        32   3200000   java.util.HashMap$Node
    300003             9768824   (total)

// ByteByteMap
java.util.HashMap@a9d12ad footprint:
     COUNT       AVG       SUM   DESCRIPTION
    100001        24   2400184   [B
         1   1048592   1048592   [Ljava.util.HashMap$Node;
         1        48        48   java.util.HashMap
    100000        32   3200000   java.util.HashMap$Node
    200003             6648824   (total)


// StrStrMap
java.util.HashMap@716d90fad footprint:
     COUNT       AVG       SUM   DESCRIPTION
    100001        31   3120344   [C
         1   1048592   1048592   [Ljava.util.HashMap$Node;
    100001        24   2400024   java.lang.String
         1        48        48   java.util.HashMap
    100000        32   3200000   java.util.HashMap$Node
    300004             9769008   (total)

ご覧のとおり、StrByteMap と StrStrMap のメモリ使用量はほぼ同じです。ここで間違ってテストしていますか?

更新:以下の@Amod Pandeyの質問を参照してください。理由も知りたいです。

4

2 に答える 2

3

Map テストでは、同じ値参照を入れているので、あまりスペースを使用しません。異なるキーを持っているのと同じように、値を異なるものにする必要があります。または、ご覧のとおり、値のタイプの選択は大きな違いはありません。

于 2016-02-27T20:45:44.897 に答える
1

奇妙だと思います。

// StrByteMap
java.util.HashMap@15327b79d footprint:
     COUNT       AVG       SUM   DESCRIPTION
         1       184       184   [B
    100000        31   3120000   [C

byte 配列の 1 つのインスタンスと char 配列の 100000 インスタンスがあります。StrStr の場合、これは 100001 文字配列です

// StrStrMap
java.util.HashMap@716d90fad footprint:
     COUNT       AVG       SUM   DESCRIPTION
    100001        31   3120344   [C

したがって、バイト配列を格納した場合でも、メモリ フットプリントは char 配列です!!

もう 1 つのポイントは、ByteByte の場合、バイト配列オブジェクトの平均サイズは 24 であり、これはバイト配列サイズの 184 (StrByteMap) より小さく、3 つのケースすべての合計数が同じであってはなりません。

于 2016-02-27T23:14:06.910 に答える