0

字符串是不可变的,并在字符串池中进行管理。我想知道这个池是如何管理的。如果在应用程序中使用了大量的字符串字面量,(我理解应该在追加、替换操作等修改较多时使用字符串生成器)然后 Pool 通过不一次又一次地重新创建新的字符串对象来提高应用程序的性能但是使用池中存在的相同对象,这是可能的,因为字符串是不可变的,这样做不会产生不良影响。

我的问题是如何String Pool管理。如果某些“k”字符串的频率很高,并且可能很少有其他字符串对象一旦创建就不会再次使用。可能使用了其他较新的字符串文字。

在这种情况下,字符串池的行为是否像 LRU 缓存一样,保存对最新使用的文字的引用并从池中删除较旧的未使用字符串?

字符串池是否有大小,或者我们可以在我们的应用程序中控制它吗?

编辑 :

通常我们为我们实现的自定义对象池分配大小。我想知道为什么 Sting Pools 没有像 LRU 这样的功能。这可能是一个功能。在大字符串的情况下也不会有问题。但我觉得它的实现方式是这样的,但我只是想知道它为什么不存在,我的意思是它不存在是出于某种正当的原因,拥有这个功能会导致一些不良影响。如果有人可以对这些不良影响有所了解,那就太好了。

4

1 回答 1

3

字符串池不是 LRU 缓存,因为除非经过 GC,否则不会取出条目。

有两种方法可以在字符串池中获取条目。字符串文字会自动进入那里,并且可以添加新条目,String.intern()除非String池中已经存在,在这种情况下会返回对它的引用。

如果没有更多对它们的引用,这些值将被垃圾收集,这对于字符串文字(例如字符串常量)可能比那些被intern()编辑的要难一些。

Java 6 和 Java 8 之间的实现发生了很大变化(甚至在次要版本之间)。字符串池的默认大小显然是1009,但可以使用-XX:StringTableSize=N(自 Java 7 起)参数进行更改。这个大小是内部哈希表的表大小,所以如果你使用很多intern()(对于字符串文字,应该很多),它可以调得更高。大小仅影响intern()调用速度,而不影响您可以实习的字符串数量。

基本上,除非您intern()大量使用(可能有充分的理由),否则几乎没有理由担心字符串池。特别是由于它不再存储在 中PermGen,所以它OutOfMemoryErrors不再容易引起。

来源

于 2016-04-25T09:56:34.227 回答