文件Memory Management in the Java HotSpot™ Virtual Machine第6页载有以下段落:
年轻一代集合的发生频率相对较高,而且效率高、速度快,因为年轻一代的空间通常很小,并且可能包含许多不再引用的对象。 幸存于一定数量的年轻一代集合的对象最终会被提升或永久保存到老一代。参见图1。这代人通常比年轻一代大,而且占用率增长更慢。因此,老一代的集合并不频繁,但是完成时间要长得多。
请有人在上面的陈述中定义“频繁”和“不频繁”是什么意思?我们说的是微秒,毫秒,分钟,天
发布于 2012-09-26 11:09:21
这是不可能给出一个明确的答案。它实际上取决于许多因素,包括平台(JVM版本、设置等)、应用程序和工作负载。
在一种极端情况下,应用程序可能永远不会触发垃圾收集器。它可能只是坐在那里什么都不做,或者它可能执行一个非常长的计算,在JVM初始化和应用程序启动之后没有创建任何对象。
在另一个极端,理论上一个垃圾收集端和另一个垃圾收集端在几纳秒内启动是可能的。例如,如果应用程序正处于整个堆死亡的最后阶段,或者正在分配病理上较大的数组,则可能会发生这种情况。
所以:
我们说的是微秒,毫秒,分钟,天吗?
以上可能都是如此,不过,如果你在实践中观察到了这两种情况,那么前两种肯定会很麻烦。
行为良好的应用程序不应该运行GC太频繁。如果应用程序每秒钟触发一次或两次以上的年轻空间收集,则可能导致性能问题。而过于频繁的“完整”集合更糟糕,因为它们的影响更大。然而,如果一个设计/实现不好的应用程序的行为是这样的,那当然是有道理的。
还有一个问题是,GC运行之间的间隔并不总是有意义的。例如,一些HotSpot GC实际上有GC线程与正常的应用程序线程同时运行。如果您有足够的内核、足够的RAM和足够的内存总线带宽,那么一个不断运行的并发GC可能不会显著影响应用程序的性能。
术语说明:
发布于 2012-09-26 09:56:41
这是一个相对的术语。年轻的收藏品可能每秒钟有很多次,最多几个小时。老一代的收藏品可以每隔几秒钟收集一次,直到每天。在大多数系统中,您应该期望拥有更多年轻的集合,而不是旧的集合。
这不太可能是很多天。如果GC发生得太频繁,例如,<< 100 ms之间的间隔,您就会得到一个OutOfMemoryError: GC Overhead Exceeded,作为JVM。
发布于 2012-09-26 10:00:30
实际上,“频繁”、“不频繁”这两个词是相对的。事实上,时间并不是固定的。这取决于所涉及的制度。这取决于很多事情,比如:
如果您的应用程序是怪物内存食人,gc会像运行它的生命一样运行。如果您的应用程序不需要太多的内存,那么gc将根据内存的大小决定运行的时间间隔。
https://stackoverflow.com/questions/12599044
复制相似问题