用例:
从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
答案 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。