Available from Java 9.
The -XX:-CompactStrings flag disables the use of the Compact Strings feature
in the JVM.
In Java, characters and strings have always been implicitly double-byte, i.e. each
character is represented by two bytes of data in Unicode UTF-16 encoding. This
allows Java programs to handle text in languages such as Chinese, Japanese
and Korean with little additional programmer effort. However it has proven to
be wasteful of memory when a program deals predominantly with single-byte
characters such as those used in English.
In Java 9 the JVM was modified to internally store strings and characters in singlebyte form when those strings contain only single-byte characters, i.e. characters
that can be represented as a single byte using the ISO-8859-1 or Latin-1 encoding.
Note that if a string contains at least one multibyte character then it is represented
entirely as UTF-16.
This internal representation is invisible to the application programmer, and it
does not affect Java source code or existing compiled Java code. All related APIs
such as StringBuilder still treat character data as double-byte. However it can
save significant amounts of memory, especially in an application that processes
If an application overwhelmingly uses multi-byte characters (e.g. an application
with a Japanese-language user interface) then it can turn off Compact Strings
using the -XX:-CompactStrings flag. This may save the performance overhead
of the JVM checking each string for the presence of multibyte characters.
The -XX:+CompactStrings flag re-enables the use of Compact Strings. Where
both -XX:-CompactStrings and -XX:+CompactStrings have been used on a
command line, the last one takes precedence.
Compact Strings are enabled by default.
Arguments Related to -XX:-CompactStrings:
• TODO: link to -XX:UseCompressedOops
• TODO: link to -XX:UseCompressedClassPointers
• Compact Strings in Java 9 (DZone Article)
If you have additional comments, interesting experiences or even point of disagreement with this JVM argument description, please leave a comment. Your
insights will help the entire 10+ million java developer community to develop
one standard source of documentation for all the JVM arguments.