Java 为什么JVM总是从一个完整的GC开始?

Java 为什么JVM总是从一个完整的GC开始?,java,jboss,garbage-collection,jvm,Java,Jboss,Garbage Collection,Jvm,我正在JBossAS5上运行的web应用程序上执行调优基准测试 我正在使用JMeter创建不同的场景,从低负载到压力负载 我注意到GC日志总是以完整GC开始 有人能给我解释一下这种行为吗 提前谢谢 FWIW,以下是GC日志中的一个片段: 17.560: [Full GC [PSYoungGen: 44456K->0K(458752K)] [ParOldGen: 0K->4385K(1572864K)] 44456K->4385K(2031616K) [PSPermGe

我正在JBossAS5上运行的web应用程序上执行调优基准测试

我正在使用JMeter创建不同的场景,从低负载到压力负载

我注意到GC日志总是以完整GC开始

有人能给我解释一下这种行为吗

提前谢谢

FWIW,以下是GC日志中的一个片段:

17.560: [Full GC [PSYoungGen: 44456K->0K(458752K)] [ParOldGen: 0K->4385K(1572864K)]      44456K->4385K(2031616K) [PSPermGen: 11565K->11555K(262144K)], 0.9226691 secs]
72.478: [GC [PSYoungGen: 393216K->30720K(458752K)] 397601K->35105K(2031616K), 0.1787110    secs]
112.137: [GC [PSYoungGen: 423936K->38912K(458752K)] 428321K->43297K(2031616K), 0.2197971 secs]
188.297: [GC [PSYoungGen: 432128K->54272K(458752K)] 436513K->58657K(2031616K), 0.3034273 secs]
309.100: [GC [PSYoungGen: 447488K->60416K(458752K)] 451873K->64801K(2031616K), 0.3111470 secs]
430.354: [GC [PSYoungGen: 453632K->65536K(454848K)] 458017K->72129K(2027712K), 0.3374716 secs]
546.078: [GC [PSYoungGen: 454848K->65536K(415104K)] 461441K->78881K(1987968K), 0.3746511 secs]
652.116: [GC [PSYoungGen: 415104K->40960K(436928K)] 428449K->88641K(2009792K), 0.3895185 secs]
765.134: [GC [PSYoungGen: 390528K->28672K(437632K)] 438209K->94882K(2010496K), 0.2703870 secs]
870.726: [GC [PSYoungGen: 380800K->23552K(375680K)] 447010K->102114K(1948544K), 0.1948568 secs]
976.144: [GC [PSYoungGen: 375680K->18432K(436096K)] 454242K->110306K(2008960K), 0.1734677 secs]

它并不总是从GC开始,你可以有一个从来没有GCs的程序

但是,当JVM启动时,默认情况下使用的内存量最小

应用程序正在构建数据结构,将保留高百分比的对象。这不是正常行为,幸存者空间可能会耗尽。JVM被调优为假设大多数新创建的对象都将被丢弃。当幸存者空间耗尽时,将触发一个完整GC

由于您知道应用程序将增长到多少内存,因此可以使用如下选项

-ms512m -mx1g

在Jboss社区的Peter Johnson的帮助下,完整的GC将消失,您收集的次数将减少。

。我已经知道这个问题的答案了

我写在这里是为了和你们分享

对System.gc()的调用被编码到应用程序服务器(或它使用的一个库中-我知道RMI库喜欢进行gc调用),我怀疑这是因为它从引导转换到应用程序服务器本身。我认为它还可能在部署或其他主要初始化活动之后执行另一个或两个GC。我认为这背后的想法是在处理用户请求之前让堆尽可能地清除垃圾。当然,这在几年前是有意义的,当时服务器没有那么多内存,堆也更小。我在JBoss的4.0.x到5.x版本中看到过这种行为(在6.0.x版本中没有监控GC行为)


+彼得:谢谢你的回答。这些选项设置为-Xms2g-xmx2g。在这种情况下,我还将尝试设置新的大小
-XX:NewSize=1g
,通常情况下,我从新应用程序的新大小8 GB开始,然后将其减小+彼得再次感谢你。但是,如何将年轻一代的大小设置为大于堆8GB?即使将新大小设置为-XX:NewSize=1g。这个问题仍然存在。我使用
-XX:NewSize=8g-mx12g
或类似的方法。我想现在可能是问题所在。仔细阅读第一行,我可以看到最初的烫发机已经满了
PSPermGen:11565K->11555K
这在应用程序中从未发生过,因为我使用JSE加载的代码要少得多。我不知道如何设置初始烫发机大小,但您可以增加最大值,这可能会增加最小值。