当前位置: 首页 > 知识库问答 >
问题:

释放stringBuilder内存的最快方法

长孙阳嘉
2023-03-14

释放stringbuilder内存的最快方法是什么。

 StringBUilder sb = new StringBuilder();
 sb.apppend(maximum value possible);

下面是我试图尽快释放内存并使对象符合垃圾收集条件的代码片段

备选案文1:

sb = null;

根据我的理解,stringBuilder中的所有数据都将被删除,对象一旦被踢入,就有资格获得垃圾回收机制,但stringBuilder占用的文本内存将被释放。它的字符串值也会从堆中删除,还是会存储在字符串池中?

选项2:

 sb.setLength(0);

这将重置字符串生成器的长度,但不会被垃圾收集

选项3:

 sb.delete(0,sb.length());

这将通过删除字符串生成器中的所有数据来重置字符串生成器,但不会被垃圾收集

选项4:

 sb.delete(0,sb.length());
 sb = null;

这将重置字符串生成器,并使其符合垃圾回收机制?!

共有3个答案

靳越
2023-03-14

确保StringBuilder符合垃圾收集条件的唯一安全方法是与所有对象相同:杀死对它的所有引用。这意味着显式地将其设置为null,或者让其退出范围。

除此之外,你无法控制何时释放内存。你能做的最多的事情就是请求垃圾收集,这很少是个好主意(更不用说你只是在请求,而不是命令JVM进行垃圾收集)。

您提出的其他选择不能保证释放所有内存,除非您已经深入研究了代码,并且确信您正在完全刷新对象的状态。这就是为什么如果你想确保一切都是“干净的”,通常最好将整个对象引用设为空,然后重新开始

龚德本
2023-03-14

简单:跟着

sb = null;

忘了其他的吧。

为什么?一旦GC能够确定一个对象符合垃圾收集的条件,它还知道从该对象引用的所有东西都符合条件。鉴于您无法控制GC的启动、清理对象和释放内存,上述任务已经足够好了。

因为它清楚地传达了你的意图,然后帮助气相色谱完成它的工作。实际上写得好的代码可能甚至不需要那个语句。

现在,也许这还不够好。但接下来我们要讨论的是一个真正的性能问题,在一个非常明确和狭窄的背景下。在这种情况下,你不依赖道听途说,你开始测量。

换句话说:如果你的设置中没有表现出真正的性能问题,并且需要采取行动,那么你就使用简单、清晰的代码,避免各种“源代码级别”的优化。但是,如果你有一个真正的性能问题,那么你就应该相应地处理它:通过确定根本原因,并可能通过测量不同选项在现实中的效果。

其他任何东西都有过早优化的味道!

轩辕远
2023-03-14

如果您真的希望尽快释放内存,那么GC选项是您需要查看的地方,而不是代码。

为此,对GC选项的详细分析超出了这里的合理范围,但具体来说,新的Shenandoah GC可以调整为比G1或并发标记/扫描更积极地释放内存,所以这可能是您想要使用的。您可以使用-XX:UseShenandoahGC指定这一点。(这是OpenJDK特有的,在这一点上是实验性的,但是如果你想要你想要的行为,它就是你想要的。)

对于快速发布时间,您需要为ShenandoahUncommitDelayshenandoahguarantedcinterval使用一个较小的值。这里的较小值(广义上)将更频繁、更积极地运行GC,因此使用更多的CPU周期——但它会产生你想要的效果,与以前的GC版本相比,内存的释放速度将非常快。

如果您只想确保释放内存,使其能够快速进行垃圾收集,那么您只需要确保对该StringBuilder的所有引用都尽快设置为null。即使在这种情况下,我也鼓励您分析并检查是否需要显式地执行此操作——在许多情况下,JVM足够聪明,可以将对象标记为符合GC的条件,即使它们在技术上仍在范围内(只要它能看到它们在该范围的其余部分不再被引用)

 类似资料:
  • 问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其

  • 问题内容: 我正在使用以下功能下载小于20MB的文件。它将全部内容读取到内存中,因为另一个功能必须先对字节执行工作,然后才能将其写入磁盘。 这可以正常工作,但是所有内存都在系统上消耗了。 是否可以在其他功能处理完之后释放使用的内存,以使内存使用量不会大于当前正在处理的字节数? 问题答案: 您可能会触发gc使用释放未使用的对象,并且可能敦促Go运行时使用释放内存到OS ,但是所有这些都只是在扑救。编

  • 问题内容: 在以下示例中,我有一些有关内存使用的相关问题。 如果我在解释器中运行, 我的机器上使用的实际内存最高为80.9mb。那我 实际内存下降,但仅限于。解释器使用基线,因此不向 释放内存有什么好处?是否因为Python正在“提前计划”,以为你可能会再次使用那么多的内存? 它为什么特别释放- 释放的量基于什么? 有没有一种方法可以强制Python释放所有已使用的内存(如果你知道不会再使用那么多

  • 我有一个问题,我的GPU内存是没有释放后关闭在Python中的tenstorflow会话。这三行足以导致问题: 在第三行之后,内存不会被释放。我在很多论坛上走来走去,尝试了各种各样的建议,但都没有效果。有关详细信息,请参见下面我的评论: https://github.com/tensorflow/tensorflow/issues/19731 在这里,我已经记录了我设法杀死进程并释放内存的方法,但

  • 我改进了代码,以便从垃圾收集器中获得更好的结果。 现在,当我调用时,它确实释放了所有内存。但是,当我在不调用 的情况下观察内存使用情况时,应用程序确实会保留并使用越来越多的内存。 这是否意味着我的改进正在起作用,我的所有引用都是正确的,我可以忽略JVM是如何自己释放内存的。或者,我的代码中是否存在其他问题,这些问题是JVM在不运行垃圾收集器的情况下保留更多内存的原因。

  • 本文向大家介绍C#如何快速释放内存的大数组详解,包括了C#如何快速释放内存的大数组详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文告诉大家如何使用 Marshal 做出可以快速释放内存的大数组。最近在做 3D ,需要不断申请一段大内存数组,然后就释放他,但是 C# 对于大内存不是立刻释放,所以就存在一定的性能问题。在博客园看到了一位大神使用 Marshal 做出快速申请的大数组,于是我就学