存在大于1s的FullGC

Posted twoheads

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存在大于1s的FullGC相关的知识,希望对你有一定的参考价值。

(目前有存在大于1s的FullGC,金桥的机器目前是2C4G的,使用的GC方法只能使用单线程进行串行的回收,导致GC比较慢。

建议可以调整GC参数,改用CMS,能够解决这个问题,

参数修改方法:

在应用 webapp/WEB-INF/tars/prod 文件夹下,创建文件 extraenv.sh

文件内容

#!/usr/bin/env bash
JAVA_OPTS="${JAVA_OPTS} -XX:+UseConcMarkSweepGC"

 

或者升级JAVA8后,默认使用CMS也能解决这个问题。)

 

ps:我查的跟上面说的不一样(https://zhuanlan.zhihu.com/p/45558897)

jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1

实际应该是,机器目前是2C4G,核心数太少,所以采用串行Serial收集器(并发时对CPU资源占用多,不适合CPU核心数较少的情况。

 

Minor GC 和 Full GC

  • 新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。具体原理见上一篇文章。
  • 老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

并行和并发

  • 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。
  • 并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行。而垃圾收集程序运行在另一个CPU上。

老年代收集器中:

Serial Old 在进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)

 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的(Parallel是并行)

 

垃圾收集器详情:https://www.cnblogs.com/twoheads/p/10207573.html

 




以上是关于存在大于1s的FullGC的主要内容,如果未能解决你的问题,请参考以下文章

jvmMinorGC和FullGC

原创大叔问题定位分享(39)azkaban定期出现fullgc

dubbo扩展http协议后FullGC

最近项目中遇到了一个场景,其实很常见,就是定时获取接口刷新数据。那么问题来了,假设我设置的定时时间为1s,而数据接口返回大于1s,应该用同步阻塞还是异步?

选项卡执行android中下一个片段中存在的代码

Minor GC ,Full GC 触发条件