Java字符串池是存储1000个字符串的最佳方法。 GC是否在字符串池上运行

时间:2019-02-08 08:21:35

标签: java string garbage-collection

用例:
从s3中获取所有片段URL作为字符串列表。然后将列表剪辑提交给摘要。

   public static void main(String[] args) {
    List<String> randomStringList = getListOfRandomeStrings();

}


static List<String> getListOfRandomeStrings() {
    List<String> randomStringList = new ArrayList<>();
    // Add 2k strings to randomStringList
    return randomStringList;
}

static void iterateList(List<String> randomStrings) {

    // Iterate and print strings
}

问题

1)何时将字符串池中的字符串进行垃圾回收?
2)有什么方法可以清洁琴弦吗?
3)使用弱引用有帮助吗?

已引用此链接,但仍不清楚 When will a string be garbage collected in java

3 个答案:

答案 0 :(得分:4)

1)无法在JVM中预测垃圾回收。

2)无法在JVM中强制垃圾回收。

3)将它们存储为弱引用将有助于(可能)更早地清除它们:

如果引用的对象较弱,则垃圾回收器将其清除。

可达性弱意味着对象既没有强引用也没有软引用指向它。只有遍历弱引用才能到达对象。

首先,垃圾收集器清除了弱引用,因此该引用对象不再可用。然后将引用放置在引用队列中,我们可以从中获取引用。

您可以致电System.gc()建议 JVM来收集垃圾,但是并没有强有力的保证。

如果您的内存不足,从理论上讲,弱引用和软引用是首选删除对象。

2000的avegare url字符串将占用大约几兆字节的内存(即使对于普通计算机,这也是“ meh”)。

因此,我宁愿以一种自然的方式进行操作-在不需要它们时将它们放在范围之外,并且在真正需要关心内存优化之前不要打扰。

答案 1 :(得分:3)

嗯,为什么要立即收拾东西?!

JVM负责管理其内存。如果认为有必要,它将进行垃圾回收。

当然:您的引用越早变得“不可用”,越快的对象就可以进行垃圾回收了,当然,弱引用可以帮助解决这一问题。

但真正的答案:不要过早优化。如果您认为有问题,请进行适当的基准测试。您现在正在对假设的问题和假设的解决方案进行假设。这很少是一个好的起点!

请注意:字符串是在字符串池中创建的。这仅适用于源代码中的 literal 字符串。最后,所有字符串都是通过new String()创建的。请参阅here以获取更多信息。

答案 2 :(得分:0)

执行此操作的一种方法是使用直接内存将字符串存储在ByteBuffer中,然后在完成后立即使用sun.misc.Cleaner将其清除。 从Java 9开始,Cleaner已移至java.lang.ref(detailed here)。 在某些情况下,您需要短时间处理大量的String而不给gc施加压力。
我在sun.misc中使用了Cleaner,而不是发布自己的代码,而是提供this rather detailed example

相关问题