【发布时间】:2021-10-18 16:41:54
【问题描述】:
有什么办法可以改变垃圾收集器的频率,是降低还是提高?
我发现一些文章说,为了提高频率,我需要增加年轻代,以便在调用 GC 之前让更多的对象进入。
但我在任何地方都没有找到真正的方法来做到这一点,用真正的命令或动作或指令如何实现它(减少或增加 GC 频率)。
【问题讨论】:
标签: java object memory garbage-collection frequency
有什么办法可以改变垃圾收集器的频率,是降低还是提高?
我发现一些文章说,为了提高频率,我需要增加年轻代,以便在调用 GC 之前让更多的对象进入。
但我在任何地方都没有找到真正的方法来做到这一点,用真正的命令或动作或指令如何实现它(减少或增加 GC 频率)。
【问题讨论】:
标签: java object memory garbage-collection frequency
你首先配置你想使用哪个垃圾收集器,然后你可以配置所说的垃圾收集器。
你读到的任何内容都是不相关的/无效的/误导性的/过于简单化了。垃圾收集非常复杂,特别是复杂到谈论“频率”并没有真正意义。 20 年前的垃圾收集很简单:
那个型号?它在 20 年前就去世了。垃圾收集现在要复杂得多,包括以下方面:
实时跟踪:JVM 使用启发式机制来快速收集垃圾子集。 (基本上,引用计数;如果 refcount 为 0,则肯定是垃圾。但是,非 0 引用计数也可能是垃圾,例如,如果 a 引用 b,b 引用 a,并且没有任何 'live' 引用:两者refcounts 为 1,但它们仍然是垃圾)。这些垃圾收集器仍然收集它们,只是没有 refcount-0 垃圾那么快。 “频率”现在是什么意思?
世代,世代之间的方法截然不同。例如,您的基本伊甸园/“快速垃圾”系统反向工作:Java 线程获得一页内存,在此处创建新对象,任何其他线程完全无法访问。一旦它满了,系统会快速检查这个和只有这个线程当前可以在上下文中访问的内容,创建一个新页面,复制仍然可以访问的对象,并将旧页面标记为空闲。 “免费垃圾收集”刚刚发生。这里的“频率”到底是什么意思?无需配置:当页面已满时,此过程将启动。直到页面已满,否则不会。无需配置。
这只是垃圾收集器所做的大约 50 件事情中的 2 件,不能简单地描述为可以明确应用“频率”一词的事情。
每个 JDK 版本都对可用的 GC 实现、这些实现的工作方式、甚至这些实现支持的设置进行了相当大的更改。这些都不是核心 java 规范的一部分,这意味着 OpenJDK 团队在不同 java 版本之间更改它们时更加随意,出于同样的原因,Azul、coretto 等替代 JDK 提供程序通常会提供额外的 GC 实现和额外的设置.
别担心。一般的经验法则是:如果你弄乱了 GC 设置,你会让一切变得更糟。如果您需要调整 GC 设置,请咨询专家,并放心,您不太可能需要它。
忘记你读过的东西。这是过时的信息。
【讨论】:
frequency 指的是 GC 运行的速率。我能否以某种方式使其每 X 分钟运行的次数多于/少于默认情况下运行的次数?