Java 释放stringbuilder内存的最快方法
释放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 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您删除了对