繁体   English   中英

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

[英]How can I optimize the code to always use the same reference to a String without increasing the memory usage?

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

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

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

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

我找到了WeakHashMap的替代品:Eclipse JDT库提供的WeakHashSet 它具有与WeakHashMap相同的行为,但它使用较少的内存。 此外,您只需要调用方法add ,如果它还不存在,它将在集合中添加String,否则返回现有的String。

我唯一不喜欢的是它不使用泛型,迫使开发人员转换对象。 我的intern方法结果非常简单,你可以看到如下:

WeakHashSet声明:

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

和实习方法:

public static String intern(String value) {
    if(value == null) {
        return null;
    }
    return (String) stringPool.add(value);
}

为什么不使用StringBuilder / StringBuffer类而不是String。 使用此类的实例,您始终可以使用具有不同值的相同实例。 - 安库尔

在类似的情况下,尽可能将字符串常量重构为枚举。 这样,您将获得两个好处:

  • 枚举实例是单例,所以你不会有内存问题
  • 使用字符串时没有拼写错误。

缺点:

  • 如果你没有足够的测试用例,那么很多工作都会有很多错误
  • 有时这不是微不足道的,例如当你必须与第三方图书馆互动时,你不能只编辑...
  • 如果这些是运行时确定的,那么根本就是禁止,而不是编译时间......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM