Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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 字符串文本的垃圾收集_Java_String_Garbage Collection - Fatal编程技术网

Java 字符串文本的垃圾收集

Java 字符串文本的垃圾收集,java,string,garbage-collection,Java,String,Garbage Collection,我正在阅读有关垃圾收集的文章,当我搜索字符串文字垃圾收集时,会得到令人困惑的搜索结果 我需要澄清以下几点: 如果一个字符串在编译时被定义为literal[例如:string str=“java”],那么它会被垃圾收集吗 如果使用intern方法[例如:String str=new String(“java”).intern()],那么它会被垃圾收集吗?它的处理方式也将不同于第1点中的字符串文字 有些地方提到,只有当Stringclass被卸载时,才会对文本进行垃圾收集?这有意义吗?因为我认为St

我正在阅读有关垃圾收集的文章,当我搜索字符串文字垃圾收集时,会得到令人困惑的搜索结果

我需要澄清以下几点:

  • 如果一个字符串在编译时被定义为literal[例如:
    string str=“java”
    ],那么它会被垃圾收集吗

  • 如果使用intern方法[例如:
    String str=new String(“java”).intern()
    ],那么它会被垃圾收集吗?它的处理方式也将不同于第1点中的字符串文字

  • 有些地方提到,只有当
    String
    class被卸载时,才会对文本进行垃圾收集?这有意义吗?因为我认为
    String
    类永远不会被卸载


  • 在正常情况下,字符串文本和类都分配到JVM的永久生成(“PermGen”)中,并且通常不会被收集。插入的字符串(例如
    mystring.intern()
    )存储在permgen中
    String
    类所拥有的内存池中,并且曾经有过这样的情况,即主动插入可能导致空间泄漏,因为字符串池本身持有对每个字符串的引用,即使不存在其他引用。显然,这不再是事实,至少在JDK1.6中是这样(参见,例如)

    有关permgen的更多信息,请参阅本主题的概述。(注意:该链接指向与产品关联的博客。我与博客、公司或产品没有任何关联,但博客条目很有用,与产品没有太多关系。)

  • 只要程序在内存中,文本字符串就会一直保留在内存中
  • str
    将被垃圾收集,但创建它的文本将不会被垃圾收集
  • 这很有道理,因为在卸载程序时,字符串类被卸载
  • intern()
    方法检查字符串池中对象的可用性。如果对象/文字可用,则将返回其引用。如果池中不存在文本,则在perm区域(字符串池)中加载对象,然后返回对该对象的引用。我们必须明智地使用
    intern()
    方法

    如果一个字符串在编译时被定义为literal[例如:
    string str=“java”
    ],那么它会被垃圾收集吗

    可能不会。代码对象将包含对表示文字的
    字符串
    对象的一个或多个引用。因此,只要代码对象是可访问的,
    字符串
    对象就可以访问

    代码对象可能变得不可访问,但前提是它们是动态加载的。。。他们的类加载器被销毁了

    如果我使用intern方法[例如:
    String str=new String(“java”).intern()
    ],那么它会被垃圾收集吗

    intern
    调用返回的对象将是表示
    “java”
    字符串文本的同一个对象。(类加载时插入
    “java”
    文本。然后在代码段中插入新构造的
    字符串
    对象时,它将查找并返回以前插入的
    “java”
    字符串。)

    但是,与字符串文本不相同的插入字符串一旦变得不可访问,就可以进行垃圾收集。PermGen空间在所有最近的热点JVM上进行垃圾收集。(在Java 8之前,它会完全删除PermGen。)

    它的处理方式也将不同于第1点中的字符串文字

    不。。。因为它与字符串文本是同一个对象

    事实上,一旦您了解了正在发生的事情,很明显字符串文本也不会被特别处理。这只是“可达性”规则的一个应用

    有些地方提到,只有当
    String
    class被卸载时,才会对文本进行垃圾收集?因为我认为
    String
    类永远不会被卸载,所以它有意义吗


    你说得对。这没有道理。说那是不正确的消息来源。(如果您发布一个URL,以便我们能够阅读他们为我们自己所说的内容,这将非常有帮助……

    1-;2 - ; 3-String a=新字符串(“asd”)->“a”引用将被垃圾收集,但它只是对“asd”和“asd”的引用如果你搜索更多,你会发现一些地方提到使用intern创建的字符串文字可以被垃圾收集,因为它们使用弱引用,但我不能确认这一点,这就是我发布的原因,因为有很多混合响应。从Java 7开始,Java字符串池存储在堆空间中,由JVM进行垃圾收集。这种方法的优点是减少了OutOfMemory错误的风险,因为未引用的字符串将从池中删除,从而释放内存Ole V.V.有正确的答案你能给我一个可以卸载字符串的例子吗?因为我相信字符串文字也必须在java类中使用,而且字符串文字是常量,根据我的知识,卸载可能需要卸载CLassLoader。你同意吗?据我所知,字符串文字不能以编程方式卸载。它们当程序终止时,将被卸载或销毁。@fredrik-如果卸载了动态加载的类,它们也可以被垃圾收集。这可能发生在JVM正常运行时。@StephenC ok。很高兴知道。这是错误的。PermGen space>>是您当然是对的。我的目的只是说数据在正常情况下,分配到permgen中的字符串不会得到GC'ed,但我的措辞有点错误。事实上,深入挖掘后,我发现内部字符串不会被垃圾收集不再是真的。(这不是因为permgen的空间,而是由于
    字符串#intern
    的实现改变了我的答案。)