Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于PermGC中的字符串对象池_Java_String - Fatal编程技术网

Java 关于PermGC中的字符串对象池

Java 关于PermGC中的字符串对象池,java,string,Java,String,我听说PermGC中存在string对象池,当执行string intern时,它首先检查池以查看是否存在等效的string对象,如果不存在,则创建一个并返回对池实例的引用 但这是我的第一个问题 我认为对象是在堆上创建的,尤其是在年轻一代中。如果它在几次垃圾收集中幸存下来,它将迁移到旧一代。有人能解释一下string对象是如何进入Perm GC中存在的池的吗 第二个问题: 字符串s=“测试”; s=“test1” 如果我将“test1”重新分配给引用s并继续使用“test1”,这是否意味着“te

我听说PermGC中存在string对象池,当执行string intern时,它首先检查池以查看是否存在等效的string对象,如果不存在,则创建一个并返回对池实例的引用

但这是我的第一个问题

我认为对象是在堆上创建的,尤其是在年轻一代中。如果它在几次垃圾收集中幸存下来,它将迁移到旧一代。有人能解释一下string对象是如何进入Perm GC中存在的池的吗

第二个问题:

字符串s=“测试”; s=“test1”

如果我将“test1”重新分配给引用s并继续使用“test1”,这是否意味着“test”(在年轻一代上创建)将被垃圾收集

第三个问题: 字符串对象池与运行时常量池的关系如何


谢谢。

是什么让你认为实习弦首先属于年轻一代?
String#intern()
方法是本机方法。对于一个实现来说,将其直接移动到permgen中是非常有可能的

第二个问题:如果没有对该
“test”
字符串实例的其他引用,则它符合垃圾收集的条件。如果是实习的话也是一样。甚至不再有任何活动引用的插入字符串也可以被垃圾收集。不过,在较旧的JVM中可能不是这样。我想它可以是特定于实现的

至于第三个问题,我不知道。我所知道的只是源代码中的字符串文本被放在同一个池中。如果要从源代码中构造一个等于字符串常量的字符串,然后将其插入,则会返回用于表示该常量的实例。将其视为立即被拘留的字符串文本


编辑:只要把你开头的几句话再读一遍,我想我明白了造成混乱的原因。当您对字符串调用
intern()
时,池中还没有相等的字符串,那么它不会首先构造一个相等的字符串。它只是将您调用的
intern()
实例移动到池中,而不是返回新引用

字符串在两种情况下进入实习生池:

  • 您可以显式地对String对象调用intern()方法
  • 您可以使用一个文本对其进行初始化(您可以给出字符串的显式内容),因为Java会自动实习生字符串文本
该池被组织为一个表,一旦一个字符串被插入,如果该值还不存在,则将其添加到池中,否则将使用对现有项的引用


在你的例子中,“test”应该去池而不是年轻的空间,不管怎样,不再引用的字符串的清理也在那里执行(我不能说它是否是用于堆的同一个GC过程的一部分,也不能说这种行为是否是标准的)

你是说只有字符串s=新字符串(“test”);将首先在年轻一代上创建字符串对象吗?@user826323那么,这将导致年轻一代中的对象。然后,如果您在其上调用
intern()
,则该实例
s
要么将被放入permgen池(如果还没有等效的字符串),要么将返回先前的池实例,这将给您留下两个引用。但是如果您有
String s=“test”在代码中,因为它是源代码文本,所以实际上池中有
“test”