String vs char[]

后端 未结 4 560
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-30 03:11

I have some slides from IBM named : \"From Java Code to Java Heap: Understanding the Memory Usage of Your Application\", that says, when we use String instead of <

4条回答
  •  终归单人心
    2021-01-30 03:41

    This figure relates to JDK 6- 32-bit.

    JDK 6

    In pre-Java-7 world strings which were implemented as a pointer to a region of a char[] array:

    // "8 (4)" reads "8 bytes for x64, 4 bytes for x32"
    
    class String{      //8 (4) house keeping + 8 (4) class pointer
        char[] buf;    //12 (8) bytes + 2 bytes per char -> 24 (16) aligned
        int offset;    //4 bytes                     -> three int
        int length;    //4 bytes                     -> fields align to
        int hash;      //4 bytes                     -> 16 (12) bytes
    }
    

    So I counted:

    36 bytes per new String("a") for JDK 6 x32  <-- the overhead from the article
    56 bytes per new String("a") for JDK 6 x64.
    


    JDK 7

    Just to compare, in JDK 7+ String is a class which holds a char[] buffer and a hash field only.

    class String{      //8 (4) + 8 (4) bytes             -> 16 (8)  aligned
        char[] buf;    //12 (8) bytes + 2 bytes per char -> 24 (16) aligned
        int hash;      //4 bytes                         -> 8  (4)  aligned
    }
    

    So it's:

    28 bytes per String for JDK 7 x32 
    48 bytes per String for JDK 7 x64.
    

    UPDATE

    For 3.75:1 ratio see @Andrey's explanation below. This proportion falls down to 1 as the length of the string grows.

    Useful links:

    • Memory usage of Java Strings and string-related objects.
    • Calculate memory of a Map Entry - a simple technique to get a size of an object.

提交回复
热议问题