提问人:Aliana 提问时间:11/16/2023 更新时间:11/16/2023 访问量:59
不可变对象的内存是如何清除的?
How immutable objects' memory cleared?
问:
我有一些问题——
- 由于字符串常量池存在于堆内存中,并且 GC 从堆内存中收集垃圾。
- 它是否也清理字符串常量池,根据我的信息,它没有。
- 那么常量池内存是如何清空的呢?
- 如何检测java的不可变类及其对象的存储位置?
请提供有关此事的一些细节。
详细介绍其工作原理。
答:
垃圾回收 在 Java 7 之前,JVM 将 Java 字符串池放在 PermGen 空间中,该空间具有固定大小——它不能在运行时扩展,也不符合垃圾回收的条件。
在 PermGen(而不是堆)中插入字符串的风险在于,如果我们插入太多字符串,我们可能会从 JVM 获得 OutOfMemory 错误。
从 Java 7 开始,Java 字符串池存储在堆空间中,这是 JVM 收集的垃圾。此方法的优点是降低了 OutOfMemory 错误的风险,因为未引用的字符串将从池中删除,从而释放内存。
对象存储在堆内存中,但对对象的引用存储在堆栈内存中。字符串池是头存储器中的特殊位置,所有字符串文字都驻留在其中,只要引用是 对字符串字面量删除,这里删除意味着所有引用,因为多个引用可以指向相同的字符串字面量,或者根本不存在对字符串字面量的任何引用,然后它被垃圾收集器删除。
有关字符串常量轮询工作原理和内存管理工作原理的更多详细信息,请关注以下文章。
1> 字符串池如何工作,引用如何存储在堆栈内存中,并且可以进行多个引用?
如果您觉得这篇文章有帮助,请点赞,这是我的第一个答案,它将让我有信心在 Stackoverflow 上做出更多贡献。
评论
字符串池只是一个包含对实例的引用的数据结构。这些引用与弱引用具有相同的语义,因此当不存在对对象的其他引用时,它们将被清除。String
由于常见的垃圾回收器通过遍历仍可访问的对象的图形来工作,因此实现这种语义并不难。它所要做的就是在遍历之后检查在遍历过程中是否遇到了所指对象。否则,将清除弱引用。
“不可变类”与 JVM 没有特别的关联,因此没有代码来检测它们。对于 JVM 来说,不可变对象只是对象。
评论