Java中垃圾收集的频率是多少?

时间:2012-09-26 09:52:01

标签: java garbage-collection

文档Memory Management in the Java HotSpot™ Virtual Machine的第6页包含以下段落:

  

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

     

在一些年轻代收藏中存活的物品是   最终晋升,或终身,到       老一辈。参见图1.这一代通常比年轻一代及其占用率更大       变得更慢。因此,老一代的收藏很少,但需要更长的时间       完整

有人可以在上述声明中定义“频繁”和“不常见”的含义吗?我们在谈论微秒,毫秒,分钟,天

5 个答案:

答案 0 :(得分:10)

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

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

在另一个极端,理论上可以在一个垃圾收集端和另一个垃圾收集端在几纳秒内启动 。例如,如果您的应用程序处于从完整堆中死亡的最后阶段,或者它正在分配病态大型数组,则可能发生这种情况。

所以:

  

我们是在谈论微秒,毫秒,分钟,天?

可能上述所有内容,虽然如果你在实践中观察它们,前两个肯定会令人不安。

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


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

术语说明:

  • 严格来说,并发GC是GC可以与应用程序线程同时运行的GC。
  • 严格来说,并行GC是GC本身使用多个线程的那个。
  • GC可以并行而不是并行,反之亦然。

答案 1 :(得分:3)

它是一个相对术语。年轻的收藏品可能是几秒钟到几个小时。老一代的收藏品可以每隔几秒钟,直到每天。在大多数系统中,你应该期望拥有比旧系列更多的年轻系列。

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

答案 2 :(得分:0)

TL DL:"频繁"并且"不经常"是相对术语,取决于内存分配率和堆大小。如果您想要一个精确的答案,您需要自己测量它以满足您的特定应用。

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

如果mode-1分配小于可用堆,则在完成之前不需要gc。也许它使用了如此少的RAM,它可以在没有收集的情况下进行第二轮模式-1。但是,最终你将耗尽免费堆,并且jvm将执行一个不常见的"集合。

但是,如果模式1分配是年轻代堆的重要部分或更大,则会更频繁地进行收集"。在年轻的gen收集期间,存活的分配(想象数据需要通过整个模式1操作),将被提升为老一代,为年轻人提供更多空间。年轻人的分配和收集现在可以继续。最终旧的堆将耗尽,并且必须被收集,因此"不经常"。

那么,频繁发生的频率如何?它取决于分配率和堆大小。如果jvm经常碰到堆限制,它会经常收集。如果有足够的堆(让我们说100GB),那么jvm不需要长时间收集。不好的一面是,当它最终收集时,可能需要很长时间才能释放100GB,停止jvm很多秒(或几分钟!)。当前的JVM比这更聪明,并且偶尔会强制收集(最好是在模式2中)。对于并行收集器,它可以在必要时一直发生。

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

答案 3 :(得分:-1)

因为规范说“相对频繁”且不常见(关于Young代),我们无法估算绝对单位的频率,如微秒,毫秒,分钟或天

答案 4 :(得分:-1)

实际上,“频繁”,“不常见”这两个词是相对的。事实上,时间安排并不固定。这取决于有问题的系统。这取决于很多事情:

  • 您的堆大小和堆的不同部分的设置(年轻,老一代,烫发)
  • 您的应用程序的内存行为。它创建了多少个对象,速度有多快?这些对象被引用多长时间等?

如果您的应用程序是怪物记忆食物,那么gc就会像它的生命一样运行。如果你的应用程序不需要太多的内存,那么gc将按照内存有多大的间隔运行。