在Java中,未分配给变量的字符串文字会导致内存泄漏吗



假设我有一个函数接受字符串参数,如func("abc")

"abc"是否会被插入(存储在字符串池中(?如果func("abc")将被调用十亿次,那么java会在池中创建十亿个"abc"字符串对象的副本吗?

否。在字符串池中,只会创建一个副本,所有具有相同字符串值的变量都将指向该副本。

为了更清晰,您可以看到下图:

https://cdn.journaldev.com/wp-content/uploads/2012/11/String-Pool-Java1.png

是的,"abc"将存储在字符串池中。除非使用new运算符显式创建新字符串,否则不会创建新字符串。

不建议强制创建新对象。但即使这样做,也不会导致内存泄漏,因为新对象绑定到某个范围,并且在不再引用时将被垃圾收集

从Java SE 13文档中,请阅读以下摘录:

字符串文字是对类string实例的引用(§4.3.1,§4.3.3(.

此外,字符串文字总是引用类的同一实例字符串。这是因为字符串文字,或者更普遍地说,字符串是常量表达式的值(§15.28(-是"内部的"以便共享唯一实例,使用String.intern方法(§12.5(.

Java中的字符串"interning"是将一个String对象存储在一个池中,这样代码中字符串文本的多个副本就可以引用同一个字符串对象,而不是多个"相同"的字符串对象。也许,下面的例子会更清楚地说明这一点:

String hello = "Hello"; //A new String object with the value "Hello" is created in the String pool; the variable hello references that object in the pool
System.out.println(hello == "Hello"); //prints true

因此,在您的情况下,即使您使用相同的String文字连续调用方法func0亿次,池中也只有一个值为"abc"的String对象,并且所有文字"abc"都引用同一对象。

for (long i = Integer.MAX_VALUE; i <= Integer.MAX_VALUE; i++)
func("abc"); //Only 1 String object is created

但是,如果您从文字显式地创建新的String对象,那么您可能会在内存中拥有多个具有相同值的String对象直到不在上下文中的对象被垃圾回收。

for (long i = Integer.MAX_VALUE; i <= Integer.MAX_VALUE; i++)
func(new String("abc")); //multiple String objects with the same value are created and will continue to exist until garbage collected. 

最新更新