我正在分析应用程序的堆转储,发现堆中有很多重复的字符串。我正在寻找一种减少重复字符串消耗的内存的方法。
下面是String对象的列表及其在堆中的计数。
Duplicate String Percentage Wasted Count
"java.lang.Throwable\n at
org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)\n
at org.apache.log4j ...[length 4460]"
1.25mb 147
"java.lang.Throwable\n at
org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)\n
at org.apache.log4j ...[length 10742]"
861.96kb 42
"java.lang.Throwable\n at
org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)\n
at org.apache.log4j ...[length 10744]"
861.96kb 42
"file" 610.99kb 19,495
"java.lang.Throwable\n at
org.apache.log4j.spi.LoggingEvent.getLocationInformation(LoggingEvent.java:247)\n
at org.apache.log4j ...[length 4493]"
608.6kb 70
答案 0 :(得分:4)
从JDK 8u20切换到G1GC,它具有字符串重复数据删除功能(请参见JEP 192: String Deduplication in G1)。
为进一步减少内存消耗,从JDK 9开始,可以在内部将ISO-8859-1 / Latin-1字符串内部压缩为字节(请参见JEP 254: Compact Strings)。