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

Java字符串池存储1000个字符串的最佳方式是什么。GC在字符串池上运行吗

漆雕欣德
2023-03-14

用例:
以字符串列表的形式从s3获取所有剪辑URL。然后将列表剪辑提交给summary。

   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)使用弱引用有帮助吗

引用了此链接,但仍不清楚java何时会对字符串进行垃圾收集

共有3个答案

惠文彬
2023-03-14

一种方法是使用直接内存将字符串存储在字节缓冲区中,然后使用sun。杂项。清洁工,你一洗完就把它清理干净。从Java9开始,Cleaner已经进入java。lang.ref(此处详述)。在一些用例中,您需要在短时间内处理大量字符串,而不必对gc施加压力<我在阳光下用过这种清洁剂。misc,我将提供这个相当详细的示例,而不是发布我自己的代码。

关浩壤
2023-03-14

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

JVM负责管理其内存。它会在认为必要时进行垃圾收集。

当然:引用越早“失效”,对象就越快符合垃圾收集的条件,当然,弱引用可以帮助实现这一点。

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

请注意:字符串是在字符串池中创建的。这只适用于源代码中的文字字符串。您的字符串最后都是通过new String()创建的。进一步阅读请参阅此处。

上官自明
2023-03-14

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

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

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

弱引用对象在弱可及时由垃圾收集器清除。

弱可达性意味着一个对象既没有指向它的强引用,也没有指向它的软引用。只有通过遍历弱引用才能到达该对象。

首先,垃圾收集器清除了一个弱引用,因此引用不再可访问。然后引用被放置在引用队列中,我们可以从那里获取它。

你可以调用系统。gc()建议JVM收集垃圾,但没有强有力的保证。

如果内存不足,理论上,弱引用和软引用是第一个被删除的候选对象。

avegare url字符串的2000将占用大约数兆字节的内存(即使对于普通机器来说,这也是一个“meh”)。

所以我更愿意建议你以一种自然的方式去做——当你不需要它们的时候,把它们放在范围之外,在你真正需要关心内存优化之前不要打扰它们。

 类似资料:
  • 问题内容: 我对Java中的StringPool感到困惑。我在阅读Java中的String一章时遇到了这个问题。用外行的术语,请帮助我了解StringPool的实际作用。 问题答案: 打印(即使我们不使用方法:比较字符串的正确方法) 当编译器优化你的字符串文字时,它会看到两者s和t具有相同的值,因此你只需要一个字符串对象。这是安全的,因为在中是不可变的。 结果,两者和都t指向同一个对象,节省了一些

  • 当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

  • 我的问题很简单。有什么区别-

  • 当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是

  • 本文向大家介绍Java中的字符串常量池是什么?,包括了Java中的字符串常量池是什么?的使用技巧和注意事项,需要的朋友参考一下 当您将字符串存储为 JVM会直接在一个单独的内存块(称为String常量池)中创建具有给定值的String对象。 每当我们尝试创建另一个String作为 JVM会验证String常量池中是否存在具有相同值的String对象,如果不是,JVM会创建新对象而不是创建新对象,而

  • 如这些问题中所述:问题1 在以下情况下,JVM将创建一个新的字符串对象,而不是使用字符串池中的现有对象: 然而,在阅读了下面两个类似的陈述之后,我有一个疑问。 从SCJP准备书: 当编译器遇到字符串文字时,它会检查池中是否已经存在相同的字符串。如果找到匹配项,对新文本的引用将指向现有的String,并且不会创建新的String文本对象。 来自JavaRanch: 在本例中,由于关键字“new”,我