java中如何判断一个对象是否可以被垃圾收集器访问?

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

有没有办法手动找出对象是否可用于垃圾收集或以某种方式触发垃圾收集器?另外,如何在 IntelliJ IDEA 中指定 GC 类型?

我知道 System.gc() 命令,但是当 JVM 看到这个命令时到底会发生什么?如何决定垃圾收集器是否工作?还有,什么情况下需要使用这个命令?

java jvm garbage-collection
1个回答
0
投票

有没有办法手动找出对象是否可用于垃圾收集或以某种方式触发垃圾收集器?另外,如何在 IntelliJ IDEA 中指定 GC 类型?

因此,看看这个问题,当我想确定和/或控制对象的生命周期时,我会问这个问题。也许我想将其从缓存中删除,或者也许我想保护堆内存并让 GC 清理最不重要的对象。

考虑到这一点,那么我相信您执行以下操作会有好处:

  1. 研究 Java 中的强引用、软引用、虚引用和弱引用。 简而言之,大多数对对象的引用都是“强引用”,这意味着它们永远不会被 GC 收集,除非它们被取消引用(即变量的值设置为 null,使对象未被引用并准备好进行 GC)将其清除)

  2. 尝试使用“弱引用”来确定您想要的内容。这样,如果发生内存清除事件,您就拥有不需要存在的引用(然后弱引用及其所指对象首先进入火线)。

    WeakReference< YourObject >weakReferencedObject = new WeakReference<>(new YourObject());

回复:Intellij GC 设置:

1 打开运行/调试配置

  • 转到“运行”>“编辑配置”
  • 选择您的应用程序 配置

2.添加虚拟机选项:

  • 在“VM Options”字段中,添加所需的垃圾收集器标志,例如 -XX:+UseZGC 或您正在运行的 JVM 类型中可用的任何 GC。

我知道 System.gc() 命令,但是当 JVM 看到这个命令吗?如何判断是否属于垃圾 收集器会工作吗?另外,什么情况下需要 使用这个命令?

尽快远离使用这个的代码味道! 根据 Oracle 自己的说法,他们不鼓励使用它,在 https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/System.html#gc( )。以下内容取自该链接:

无法保证此努力将回收任何特定数量的 未使用的对象,回收任何特定数量的空间,或完成于 在该方法返回之前或曾经的任何特定时间(如果有的话)。 也不能保证这种努力将决定改变 任何特定数量的对象的可达性,或者任何 特定数量的引用对象将被清除并排队。

还要记住,通常当某些 GC 算法运行时,它们会像他们所说的那样触发“停止世界”事件,这意味着所有 JVM 线程都必须在 GC 收集时在安全点/快照点暂停垃圾(或者执行诸如标记取消引用的对象以进行收集等操作,具体取决于算法)。即使在其他可能不完全像这样运行的收集器中,大多数情况下运行 GC 也会降低性能。您必须衡量您的应用程序的成本,看看它是否值得。一个人的微不足道的成本可能是另一个人的 SLA 突破点。

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