13

Java HotSpot™ 虚拟机中的内存管理文档的第 6 页包含以下段落:

年轻代收集相对频繁并且高效快速,因为年轻代空间通常很小并且可能包含许多不再引用的对象。

在一定数量的年轻代集合中幸存下来的对象最终会被提升或永久保存到老年代。参见图 1。这一代通常比年轻代大,并且其占用增长更慢。因此,老年代收集很少,但需要更长的时间才能完成

有人可以在上面的陈述中定义“频繁”和“不频繁”的含义吗?我们是在说微秒、毫秒、分钟、天吗?

4

5 回答 5

16

对此无法给出明确的答案。这实际上取决于很多因素,包括平台(JVM 版本、设置等)、应用程序和工作负载。

在一种极端情况下,应用程序可能永远不会触发垃圾收集器。它可能只是坐在那里什么都不做,或者它可能执行一个非常长的计算,其中在 JVM 初始化和应用程序启动之后没有创建任何对象。

在另一个极端,理论上有可能一个垃圾收集结束,另一个垃圾收集在几纳秒内开始。例如,如果您的应用程序处于从满堆死亡的最后阶段,或者如果它正在分配病态的大数组,则可能会发生这种情况。

所以:

我们是在说微秒、毫秒、分钟还是天?

可能是以上所有,但如果您在实践中观察前两个肯定会令人不安。

表现良好的应用程序不应过于频繁地运行 GC。如果您的应用程序每秒触发一次或两次以上的年轻空间收集,那么这可能会导致性能问题。过于频繁的“完整”收集更糟糕,因为它们的影响更大。但是,设计/实现不佳的应用程序表现出这样的行为当然是合理的。


还有一个问题是 GC 运行之间的间隔并不总是有意义的。例如,一些 HotSpot GC 实际上具有与正常应用程序线程同时运行的 GC 线程。如果您有足够的内核、足够的 RAM 和足够的内存总线带宽,那么持续运行的并发 GC可能不会明显影响应用程序性能。

术语注释:

  • 严格来说,并发 GC 是 GC 可以与应用程序线程同时运行的一种。
  • 严格来说,并行 GC 是 GC 本身使用多个线程的情况。
  • GC 可以是并发的而不是并行的,反之亦然。
于 2012-09-26T11:09:21.570 回答
4

它是一个相对术语。年轻的收集可能每秒多次,最多几个小时。老年代收集可以每隔几秒钟收集一次,最多每天收集一次。在大多数系统中,您应该期望拥有比旧集合更多的年轻集合。

它极不可能是很多天。如果 GC 发生得太频繁,例如间隔 << 100 毫秒,你会得到一个OutOfMemoryError: GC Overhead Exceeded,因为 JVM 阻止了这种情况的发生。

于 2012-09-26T09:56:41.167 回答
0

事实上,术语“频繁”、“不频繁”是相对的。事实上,时间安排并不是固定的。这取决于所讨论的系统。这取决于很多事情,例如:

  • 您的堆大小和堆不同部分的设置(young、old gen、perm gen)
  • 您的应用程序的内存行为。它创建了多少个对象,速度有多快?这些对象被引用了多长时间等?

如果您的应用程序是怪物内存吞噬者,那么 gc 会像它的生命一样运行。如果您的应用程序不需要太多的内存,那么 gc 将根据内存的使用间隔运行。

于 2012-09-26T10:00:30.950 回答
0

TL DL:“频繁”和“不频繁”是相对术语,取决于内存分配率和堆大小。如果您想要一个精确的答案,您需要针对您的特定应用自行测量。

假设您的应用程序有两种模式,模式 1 分配内存并进行计算,模式 2 处于空闲状态。

如果模式 1 分配小于可用堆,则在完成之前不需要发生 gc。也许它使用的 RAM 太少,以至于它可以在不收集的情况下执行第二轮模式 1。然而,最终你会用完空闲堆,jvm 将执行“不频繁”的收集。

但是,如果模式 1 分配是年​​轻代堆的很大一部分或大于年轻代堆,则收集将更“频繁”地发生。在年轻代收集期间,存活的分配(想象整个模式1操作需要数据)将被提升到老代,给年轻代更多的空间。Young-gen 分配和收集现在可以继续。最终老代堆会用完,必须被收集,因此“很少”。

那么,频繁的频率是多少?这取决于分配率和堆大小。如果 jvm 经常碰到堆限制,它会经常收集。如果有很多堆(比如说100GB),那么jvm就不需要收集很长时间了。不利的一面是,当它最终进行收集时,可能需要很长时间才能释放 100GB,从而使 jvm 停止数秒(或数分钟!)。当前的 JVM 比这更智能,并且偶尔会强制收集(最好在模式 2 中)。使用并行收集器,如有必要,它可能会一直发生。

最终,频率取决于任务和堆,以及各种 vm 参数的设置方式。如果您想要一个精确的答案,您必须针对您的特定应用自行测量它们。

于 2014-10-29T23:05:29.390 回答
-2

因为规范说“相对频繁”和不频繁(关于年轻代),我们无法以绝对单位估计频率,如微秒、毫秒、分钟或天

于 2012-09-26T09:56:05.977 回答