我有一个Java应用程序,它在不同的环境中显示不同的GC行为。在一个环境中,堆使用图是一个缓慢的锯齿状,每隔10个小时或更长时间进行一次major GC,只有当堆占用率> 90%时才进行。在另一个环境中,JVM每小时准点进行major GC(此时堆通常在10%到30%之间)。
我的问题是,导致JVM决定执行major GC的因素是什么?
显然,当堆接近满时会进行收集,但还有其他原因在起作用,我猜测这与我的应用程序内部的每小时计划任务有关(尽管此时没有内存使用量的飙升)。
我认为GC行为严重依赖于JVM;我正在使用:
- Java HotSpot(TM)64位Server VM 1.7.0_21 Oracle Corporation - 没有特定的GC选项,因此使用64位服务器的默认设置(PS MarkSweep和PS Scavenge)
其他信息:
- 这是在Tomcat 6中运行的Web应用程序。 - Perm gen在两个环境中都约为10%。 - 具有锯齿行为的环境具有7Gb最大堆,而另一个环境具有14Gb。
请不要猜测。JVM必须有规则来决定何时执行major GC,这些规则必须在源代码深处编码。如果有人知道它们在哪里记录或文档化,请分享!
我的问题是,导致JVM决定执行major GC的因素是什么?
显然,当堆接近满时会进行收集,但还有其他原因在起作用,我猜测这与我的应用程序内部的每小时计划任务有关(尽管此时没有内存使用量的飙升)。
我认为GC行为严重依赖于JVM;我正在使用:
- Java HotSpot(TM)64位Server VM 1.7.0_21 Oracle Corporation - 没有特定的GC选项,因此使用64位服务器的默认设置(PS MarkSweep和PS Scavenge)
其他信息:
- 这是在Tomcat 6中运行的Web应用程序。 - Perm gen在两个环境中都约为10%。 - 具有锯齿行为的环境具有7Gb最大堆,而另一个环境具有14Gb。
请不要猜测。JVM必须有规则来决定何时执行major GC,这些规则必须在源代码深处编码。如果有人知道它们在哪里记录或文档化,请分享!