不可变对象的内存如何清除?

问题描述 投票:0回答:1

我有一些问题-

  1. 由于字符串常量池存在于堆内存中,GC从堆内存中收集垃圾。
  2. 它是否也会清理字符串常量池,根据我的信息,它不会。
  3. 那么常量池内存是如何清除的呢?
  4. 如何检测java的不可变类及其对象的存储位置?

请提供一些有关此事的详细信息。

详细了解其工作原理。

java memory memory-leaks garbage-collection immutability
1个回答
0
投票

垃圾收集 在 Java 7 之前,JVM 将 Java 字符串池放置在 PermGen 空间中,该空间具有固定的大小 - 它无法在运行时扩展,并且不符合垃圾回收的条件。

在 PermGen(而不是堆)中驻留字符串的风险是,如果驻留太多字符串,我们可能会从 JVM 收到 OutOfMemory 错误。

从Java 7开始,Java字符串池存储在堆空间中,由JVM进行垃圾收集。这种方法的优点是降低了 OutOfMemory 错误的风险,因为未引用的字符串将从池中删除,从而释放内存。

对象存储在堆内存中,但对象的引用存储在栈内存中。字符串池是头内存中的特殊位置,每当引用时,所有字符串文字都驻留在其中。 到已删除的字符串文字,这里删除意味着所有引用,因为多个引用可以指向相同的字符串文字,或者只是不存在对字符串文字的任何引用,然后它会被垃圾收集器删除。

有关字符串常量轮询如何工作以及内存管理如何工作的更多详细信息,请关注以下文章。

1> 字符串池是如何工作的以及引用如何存储在堆栈内存中以及如何可以进行多次引用?

2> 字符串常量池的内存管理是如何工作的?

如果您觉得这篇文章有帮助,请点赞,这是我的第一个答案,它将让我有信心在 Stackoverflow 上做出更多贡献。

© www.soinside.com 2019 - 2024. All rights reserved.