On this blog post, it’s said that the minimum memory usage of a String is:
8 * (int) ((((no chars) * 2) + 45) / 8) bytes.
So for the String “Apple Computers”, the minimum memory usage would be 72 bytes.
Even if I have 10,000 String objects of twice that length, the memory usage would be less than 2Mb, which isn’t much at all. So does that mean I’m underestimating the amount of Strings present in an enterprise application, or is that formula wrong?
Thanks
String storage in Java depends on how the string was obtained. The backing
chararray can be shared between multiple instances. If that isn’t the case, you have the usual object overhead plus storage for one pointer and threeints which usually comes out to 16 bytes overhead. Then the backing array requires 2 bytes percharsincechars are UTF-16 code units.For
"Apple Computers"where the backing array is not shared, the minimum cost is going to beints for the offset, length, and memoized hashcode – 12Bintfor the array length.So roughly 72B of which the actual payload constitutes 44.4%. The payload constitutes more for longer strings.
In Java7, some JDK implementations are doing away with backing array sharing to avoid pinning large
char[]s in memory. That allows them to do away with 2 of the threeints.That changes the calculation to 64B for a string of length 16 of which the actual payload constitutes 50%.