java - 为什么 JVM 总是以 FULL GC 开始?

标签 java jboss garbage-collection jvm

我正在对运行在 JBoss AS5 上的 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 开始,你可以有一个从不 GC 的程序。

然而,当 JVM 启动时,它默认使用最少的内存。

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

因为您知道您的应用程序将增长到多少内存,您可以使用像这样的选项

-ms512m -mx1g

完整的 GC 将消失,您收集的频率也会降低。

关于java - 为什么 JVM 总是以 FULL GC 开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413483/

相关文章:

java - EJBInvokerServlet/JMXInvokerServlet

java - 编译使用 Errai 框架的 gwt 项目时出错

java - 垃圾收集器是守护线程吗?

Java 垃圾收集器 : PSYoungGen grows by 4 GB after Full GC

java - 使用 Spring 框架在 JSP 页面中显示可变长度的字符串列表

java - 无法启动 Eclipse Helios

java.sql.SQLRecoverableException : Closed Connection; State=08003; ErrorCode=17008

java - 如何验证/强制类被垃圾收集

java - 使用 Java 解析 XML,遍历 DOM 树

java - 您可以将带有 int、double 或只是字符串的数据添加到 JTable 中吗