我正在寻找处理Java应用程序中堆内存中重复字符串的最佳方法吗?

时间:2019-01-02 12:43:28

标签: java

我正在分析应用程序的堆转储,发现堆中有很多重复的字符串。我正在寻找一种减少重复字符串消耗的内存的方法。

下面是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

1 个答案:

答案 0 :(得分:4)

从JDK 8u20切换到G1GC,它具有字符串重复数据删除功能(请参见JEP 192: String Deduplication in G1)。

为进一步减少内存消耗,从JDK 9开始,可以在内部将ISO-8859-1 / Latin-1字符串内部压缩为字节(请参见JEP 254: Compact Strings)。