如何优化代码以始终对String使用相同的引用而不增加内存使用量?

Dan*_*ira 9 java string optimization memory-management

我正在开发一个具有大量重复字符串的应用程序,我的任务是消除它们以减少内存使用量.我的第一个想法是用来String.intern保证只存在一个String的引用.它有助于减少堆内存,但它增加了PermGen的方式; 事实上,因为有许多字符串只被声明一次,实际上应用程序使用的内存总量增加了.

在寻找其他想法后,我发现了这种方法:https://stackoverflow.com/a/725822/1384913.

它与String.intern发生了同样的事情:字符串使用量减少了,但我保存的内存正在WeakHashMapWeakHashMap$Entry类中使用.

是否有一种有效的方法只为每个字符串维护一个引用,而不占用我正在恢复的相同内存量?

Dan*_*ira 1

我找到了一个替代方案WeakHashMapWeakHashSetEclipse JDT 库提供的。它具有与 相同的行为WeakHashMap,但使用的内存更少。此外,您只需要调用该方法add,如果该字符串尚不存在,它就会将其添加到集合中,否则返回现有的字符串。

我唯一不喜欢的是它不使用泛型,迫使开发人员强制转换对象。我的intern方法非常简单,如下所示:

声明WeakHashSet

private static WeakHashSet stringPool = new WeakHashSet(30000); //30 thousand is the average number of Strings that the application keeps.
Run Code Online (Sandbox Code Playgroud)

和实习生方法:

public static String intern(String value) {
    if(value == null) {
        return null;
    }
    return (String) stringPool.add(value);
}
Run Code Online (Sandbox Code Playgroud)