Java 释放stringbuilder内存的最快方法

Java 释放stringbuilder内存的最快方法,java,performance,garbage-collection,Java,Performance,Garbage Collection,释放stringbuilder内存的最快方法是什么 StringBUilder sb = new StringBuilder(); sb.apppend(maximum value possible); 下面是我试图尽快释放内存并使对象符合垃圾收集条件的代码片段 备选案文1: sb = null; 据我所知,stringbuilder中的所有数据都将被删除,对象一被踢入就有资格进行垃圾收集,但stringbuilder占用的文本内存将被释放。此外,其中的字符串值是否也将从堆中删除或存储在

释放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个步骤:

  • 调用
    sb.setLength(0)
    。这将字符串生成器内部长度设置为
    0
    ,这是步骤2所需的
  • 调用
    sb.trimToSize()
    。这将用一个新的修剪数组替换
    数组,在我们的例子中,大小为
    0的
    char[]
  • sb=null
    将删除对
    StringBuilder
    的引用
  • 如果字符串生成器仅由您使用,并且没有传递到其他任何地方,则应使前面的
    数组和字符串生成器eglibe用于垃圾收集


    尽管实际发生的时间仍然取决于JVM,因此“最快的方法”可能不可能,因为它实际上是随机的。

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

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

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

    sb = null;
    
    忘了其他的吧

    为什么??只要GC能够确定一个对象符合垃圾收集的条件,它还知道从该对象引用的所有东西都符合条件。考虑到您对GC的启动、清理对象和释放内存没有控制权,上面的分配已经足够好了

    因为它清楚地传达了您的意图,然后帮助GC完成其工作。实际上,编写良好的代码甚至可能不需要该语句

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

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


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

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

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

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


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

    只需让StringBuilder对象超出范围(在最后的大括号处),不要用不必要的语句使代码混乱,徒劳地试图让垃圾收集器更快地完成其工作。当StringBuilder对象超出范围时,它将有资格进行垃圾收集。保持源代码干净。

    您也可以调用
    System.gc()将指示JVM对垃圾收集进行优先级排序。。。但这并不能保证有效。。。这真的不必要。为了您的合作者的集体理智,请不要这样做。@AhmadQureshi您删除了对