在Java中,当一个对象没有实时引用时,它就有资格进行垃圾回收。对于字符串,情况并非如此,因为字符串将进入字符串池,而JVM将保持对象活动以供重用。这意味着字符串一旦创建就永远不会被垃圾收集?
你是对的;实习池中的字符串永远不会被GC。
但是,not interned.
字符串文字上的大多数字符串都是interned的,传递给String.intern()
的字符串也是interned的,但是所有其他字符串都不是interned的,可以正常地进行GC。
对于string,情况并非如此,因为string将进入string池,而JVM将保持对象的活动状态以便重新使用。这意味着字符串一旦创建就永远不会被垃圾收集?
首先,只有字符串文字(请参阅注释)才会被自动存储/添加到字符串池中。应用程序在运行时创建的String
对象不会被内部...除非应用程序显式调用String.intern()
。
其次,实际上垃圾收集字符串池中对象的规则与其他string
对象相同:实际上是所有对象。如果GC发现它们无法访问,则它们将被垃圾收集。
在实践中,与字符串文字相对应的string
对象通常不会成为垃圾回收的候选对象。这是因为在使用文字的每个方法的代码中都有对string
对象的隐式引用。这意味着只要可以执行该方法,就可以访问string
。
然而,情况并非总是如此。如果在动态加载的类中定义了字符串文字(例如,使用class.forName(...)
),则可以安排卸载该类。如果发生这种情况,那么与文字对应的string
对象就可能无法访问,最终可能会被GC。
另见:类垃圾在Java是什么时候、怎么收的?
备注:
>
字符串文字(JLS 3.10.5)是出现在Java源代码中的字符串;例如。
"abc" // string literal
new String(...) // not a string literal
通过计算(编译时)常量表达式(JLS15.28)产生的字符串也可以被存储。
"abc" + 123 // this is a constant expression
严格地说,并不是所有的字符串文字都被嵌入。如果字符串文本仅作为常量表达式的子表达式出现在源代码中,那么该文本可能不会以任何形式出现在“.class”文件中。这样的文字不会被扣留,因为它在运行时不会存在。
在Java 7之前,弦乐池是在Permgen。对于某些版本的Java,如果您选择了CMS收集器,默认情况下不会启用PermGen的垃圾收集。但是CMS从来不是默认的收集器,并且有一个标志可以通过CMS启用PermGen收集。(没有人应该再为Java 6和更早的版本开发代码了。)
问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据
问题内容: 据我所知,GC仅在JVM需要更多内存时才使用,但我不确定。所以,请有人提出这个问题的答案。 问题答案: 据我了解,Java的垃圾收集算法非常复杂,而且不那么直接。另外,GC可用的算法还不止这些,可以在VM启动时通过传递给JVM的参数进行选择。 这里有一个有关垃圾收集的常见问题解答:http : //www.oracle.com/technetwork/java/faq-140837.h
问题内容: 我正在阅读有关垃圾收集的信息,当我搜索字符串文字垃圾收集时,搜索结果令人困惑。 我需要澄清以下几点: 如果在编译时将字符串定义为文字字符串,那么是否会对其进行垃圾回收? 如果使用实习方法,那么它会被垃圾回收吗?在第1点中,它也将与文字区别对待。 有人提到只有在卸载类时才会对文字进行垃圾回收吗?是否有道理,因为我认为永远不会卸课。 问题答案: 如果在编译时将字符串定义为文字字符串,那么是
问题内容: 我对可以控制CMS收集器启动时间的两个参数感到困惑: (默认为70%) (默认情况下超过90%) 这些参数的确切含义是什么?收集器什么时候开始(标记阶段)并收集(清扫阶段)? 问题答案: 决定何时启动CMS(为了使此选项生效,您还必须设置)。是确定世代空间大小的选项。 参见例如… http://java.sun.com/docs/hotspot/gc1.4.2/faq.html 通常无
问题内容: 在这个主题中,我问了一个有关Java垃圾收集的问题。但是我得到的答案又给了我一个问题。 有人提到垃圾回收器也可以收集类。这是真的? 如果是真的,这是如何工作的? 问题答案: 没有任何引用时,可以对Java中的类进行垃圾回收。在大多数简单的设置中,这永远不会发生,但是在某些情况下可能会发生。 有很多方法可以使类可达,从而阻止其符合GC的资格: 该类对象仍然可以访问。 表示类的对象仍然可以
问题内容: 我正在Wikipedia中阅读有关内容,并看到了这段代码 当它运行时,这就是结果 在gc之前:r =我在这里,静态=我在这里 在gc之后:r = null,static =我在这里 和变量都是引用字符串对象。现在已被垃圾收集了,但是为什么在调用垃圾收集器之后没有进行垃圾收集呢? 我很好奇这是怎么发生的。 问题答案: 这 并不是 因为字符串池 本身 。 真正的原因是该类对表示文字的Str