首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java HeapDump分析:字符串还是StringBuilder,应该使用什么?

Java HeapDump分析:字符串还是StringBuilder,应该使用什么?
EN

Stack Overflow用户
提问于 2016-05-19 09:30:16
回答 2查看 566关注 0票数 2

在我的应用程序中,有一个堆转储,令人惊讶的是,char[]保留的堆大约有700 me,这很奇怪(至少对我来说是这样)。同时,String只有150 At。

在我的应用程序中,我只使用了StringBuilder (使用默认的StringBuilder构造函数),并试图避免使用String,因为我们在附加数据。

我在这里的问题是:我们应该永远支持StringBuilder吗?如果是,我们如何减少它所保留的堆?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-19 14:40:42

是的,在构建字符串时总是使用StringBuilder --这是连接字符串的最有效但仍然方便的方式。

听起来好像有很多StringBuilder在等待垃圾收集。然而,为了减少堆的使用,您可以安全地重用您的StringBuilder,即使它们不是线程安全,方法是通过Threadlocal每个线程使用一个StringBuilder

代码语言:javascript
复制
private static final ThreadLocal<StringBuilder> LOCAL_STRING_BUILDER =
    ThreadLocal.withInitial(StringBuilder::new);

示例用法:

代码语言:javascript
复制
public String logMessage() {
    StringBuilder sb = LOCAL_STRING_BUILDER.get();
    sb.setLength(0); // Only resets the pointer to start. Doesn't affect the backing array
    sb.append("foo=").append(myField); //etc
    return sb.toString();
}

您最多只能拥有与有线程一样多的StringBuilder,这不会有那么多(可能是10到100)。

无论如何,在手动连接字符串时都会使用FYI StringBuilder;这行源:

代码语言:javascript
复制
String str3 = str1 + str2;

获取编译后的结果,就好像它是:

代码语言:javascript
复制
String str3 = new StringBuilder().append(str1).append(str2).toString();
票数 0
EN

Stack Overflow用户

发布于 2016-05-19 09:40:46

您可能可以使用StringInterner,它使用一个StringBuilder来避免创建对象,needlessly.You首先用文本填充可回收的StringBuilder,如果与该文本匹配的字符串在内部器中,则返回该字符串(或StringBuilder的toString() )。这样做的好处是,当您看到一个新字符串(或至少一个不在数组中)时,您只创建对象(不超过需要),这可以在加载许多字符串数据时获得80%至99%的命中率,并大大减少内存消耗(和垃圾)。

代码:https://github.com/OpenHFT/Java-Lang/blob/master/lang/src/main/java/net/openhft/lang/pool/StringInterner.java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37319180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档