`

GC的默认方式

    博客分类:
  • JVM
 
阅读更多

 

相关文章:详解Java GC的工作原理+Minor GC、FullGC

最近线上出现一个故障,因为是JVM配置参数问题,导致的gc有问题,从而导致JVM挂起,以至于不能提供服务,现在把JVM默认的gc方式以及在日志中的体现汇总一下。

 

关于server模式和client模式:

 

 

JVM如果不指定-server或-client选项,JVM会在启动的时候根据硬件环境判断以server模式启动还是以client模式启动(适用于Java 5及以上版本)。
JVM 工作在server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是, 则以server模式启动,否则以client模式启动,Java 5检测的根据是至少2个CPU和最低2GB内存。
当JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用server模式。

 

      Young区GC的方式:

 


1、 串行GC(Serial Copying)
client模式下的默认GC方式,也可使用-XX:+UseSerialGC指定。

2、 并行回收GC(Parallel Scavenge)
server模式下的默认GC方式,也可用-XX:+UseParallelGC强制指定。
采用PS时,默认情况下JVM会在运行时动态调整Eden:S0:S1的比例,如果不希望自动调整可以使用-XX:-UseAdaptiveSizePolicy参数,内存分配和回收的算法和串行相同,唯一不同仅在于回收时为多线程。

3、 并行GC(ParNew)
CMS GC时默认采用,也可以采用-XX:+UseParNewGC指定。
内存分配、回收和PS相同,不同的仅在于会收拾会配合CMS做些处理。

 

Old区GC的方式:

1、 串行GC(Serial MSC)
client模式下的默认GC方式,可通过-XX:+UseSerialGC强制指定。每次进行全部回收,进行Compact,非常耗费时间。

2、 并行GC(Parallel MSC)
server模式下的默认GC方式,也可用-XX:+UseParallelGC=强制指定。可以在选项后加等号来制定并行的线程数。

3、 并发GC(CMS)线上环境采用的GC方式,也就是Realese环境的方式
使用CMS是为了减少GC执行时的停顿时间,垃圾回 收线程和应用线程同时执行,可以使用-XX:+UseConcMarkSweepGC=指定使用,后边接等号指定并发线程数。CMS每次回收只停顿很短的 时间,分别在开始的时候(Initial Marking),和中间(Final Marking)的时候,第二次时间略长。具体CMS的过程可以参考相关文档。
JStat中将Initial Mark和Remark都统计成了FGC。
CMS一个比较大的问题是碎片和浮动垃圾问题(Floating Gabage)。碎片是由于CMS默认不对内存进行Compact所致,可以通过-XX:+UseCMSCompactAtFullCollection。

 

 

 

组合方式:

 

默认的情况

 

启动模式 新生代GC方式 旧生代和持久带GC方式
client 串行 串行
server 并行回收GC 并发GC

 

一条日志解析:

 

 

(1)young区并行GC的一条日志
2012-03-16T00:40:45.298+0800: 2643.312:----日志打印时间
[GC 2643.312:
[ParNew:1775248K->10302K(1922432K), 0.0101690 secs] ----新生代使用空间为1775248K,回收后为10302K,分配的内存区域1922432K,消耗的时间
1975044K->210184K(4019584K), 0.0104000 secs]-----整个heap区域的情况
[Times: user=0.02 sys=0.00, real=0.00 secs] -----Young GC期间的性能消耗

 

 

 

 

 

(2)由于CMS GC执行时分为多步,所以输出的日志也较多
2012-03-16T18:29:20.007+0800: 66966.285: [GC [1 CMS-initial-mark: 1677742K(2097152K)] 1760380K(4019584K), 0.0566720 secs]
[Times: user=0.05 sys=0.00, real=0.06 secs] 进行initial Marking步骤,旧生带的大小为2097152K,在被占用1677742K后出发GC,还是0.06sccs
2012-03-16T18:29:20.064+0800: 66966.342: [CMS-concurrent-mark-start]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-mark: 3.243/3.243 secs] [Times: user=7.05 sys=0.07, real=3.24 secs]
2012-03-16T18:29:23.307+0800: 66969.586: [CMS-concurrent-preclean-start]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-preclean: 0.020/0.023 secs] [Times: user=0.00 sys=0.01, real=0.02 secs]
2012-03-16T18:29:23.331+0800: 66969.609: [CMS-concurrent-abortable-preclean-start]
CMS: abort preclean due to time 2012-03-16T18:29:28.437+0800: 66974.716: [CMS-concurrent-abortable-preclean: 5.071/5.106 secs] [Tim
es: user=5.87 sys=0.18, real=5.12 secs]
2012-03-16T18:29:28.439+0800: 66974.717: [GC[YG occupancy: 442888 K (1922432 K)]66974.718: [Rescan (parallel) , 0.2664000 secs]66974
.984: [weak refs processing, 0.0188380 secs]66975.003: [class unloading, 0.0251650 secs]66975.028: [scrub symbol & string tables, 0.
0171980 secs] [1 CMS-remark: 1677742K(2097152K)] 2120631K(4019584K), 0.3318590 secs] [Times: user=0.81 sys=0.00, real=0.32 secs]
2012-03-16T18:29:28.773+0800: 66975.052: [CMS-concurrent-sweep-start]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-sweep: 2.943/3.007 secs] [Times: user=3.42 sys=0.13, real=3.01 secs]
2012-03-16T18:29:31.780+0800: 66978.059: [CMS-concurrent-reset-start]
2012-03-16T18:29:31.786+0800: 66978.065: [CMS-concurrent-reset: 0.005/0.005 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
重新初始化CMS的相关数据,为下次CMS GC做准备
 
 (3)当旧生带和持久带出发GC时,其实是对新生代、旧生带、以及持久带都进行GC,俗称Full GC
除了直接的System.gc()外,出发Full GC的情况还有如下四种
一、旧生代空间不足:java.lang.outOfMemoryError:java heap space
二、Perm空间满:java.lang.outOfMemoryError:PermGen space
三、CMS GC时出现promotion failed  和concurrent  mode failure,
promotion failed是在Minor GC是,S区域放不下,而此时旧生带也放不下造成的;
concurrent mode failure是在CMS GC的时候,有对象放入旧生代,此时旧生代放不下导致的;
 由于concurrent mode failure失败,由于CMS GC失败出发的Full GC
2012-03-01T12:01:06.062+0800: 53.487:
[Full GC 53.487:
[CMS2012-03-01T12:01:06.170+0800: 53.595: [CMS-concurrent-abortable-preclean:3.696/5.047 secs][Times: user=11.57 sys=1.46, real=5.04 secs]

(concurrent mode failure): 0K->107493K(2146304K), 1.0931670 secs] 926560K->107493K(4023680K),

[CMS Perm : 98303K->97840K(98304K)], 1.0939460 secs] [Times: user=0.83 sys=0.12, real=1.10 secs]
 
四、统计得到的minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

 

 

 

 

 

--------------------------------------------------------------------------------------------------

 

内存区域的分配见下图

 

分享到:
评论

相关推荐

    1.28寸tft(GC9A01驱动240240像素)+STM32F103

    1.28寸tft(GC9A01驱动240240像素)+STM32F103 使用硬件SPI =================电源接线==================== LCD模块 STM32单片机 VCC 接 3.3V //电源 GND 接 GND //电源地 ==================液晶屏数据线线======...

    gc2145_bpi_a64_android验证完成_改全部的ov5640为gc2145_20170524_1113没有外层目录.7z

    小技巧,直接在全志A64的SDK中搜索ov5640(默认是几乎通的),全部替换为gc2145即可。 1、 R:\wyb\gc2145_bpi_a64_android\android\device\softwinner\bpi-m64-lcd\configs\camera.cfg ;---------------------------...

    gc2145_tinav2.1验证完成20170523_1648.7z

    4、配置为在系统启动的时候加载gc2145.ko(SDK默认加载的是gc0308.ko) R:\wyb\gc2145_tinav2.1\target\allwinner\astar-common\modules.mk define KernelPackage/sunxi-vfe SUBMENU:=$(VIDEO_MENU) TITLE:=sunxi-...

    核心网5GC业务流程培训课件78页.ppt

    2 无线基站可以选择默认AMF,或者根据RAT+NSSAI选择一个AMF; 3 AMF基于IMSI信息选择一个AUSF,为用户执行接入认证; 4 一旦成功认证,AMF向UDM发起位置更新请求,这些信息可以存储在UDR中; 5 AMF从UDM获取用户...

    gc2145_parrotv1.1_r16m_验证完成_20170523_1408没有外层目录.7z

    (默认分辨率是VGA分辨率:640x480) /* 1600X1200 UXGA capture */ static struct regval_list sensor_uxga_regs[] ={ /* 800X600 SVGA,30fps*/ static struct regval_list sensor_svga_regs[] = //1280*720---...

    JAVA面试题垃圾收集机制

    1.介绍下垃圾收集机制(在什么时候,对什么,做了什么)? 在什么时候? 在触发GC的时候,具体如下,这里只说...heap dump带GC默认也是触发Full GC。 CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。

    Java9中的GC调优基础

    Java9引入了很多新的特性,除了闪瞎眼的ModuleSystem和REPL,最重要的变化我认为是默认GC(GarbageCollector)修改为新一代更复杂、更全面、性能更好的G1(Garbage-First)。JDK的维护者在GC选择上一直是比较保守的...

    核心网5GC业务流程培训课件.pdf

    • 2 无线基站可以选择默认AMF,或者根据RAT+NSSAI 选择一个AMF; • 3 AMF基于IMSI信息选择一个AUSF,为用户执行接入 认证; • 4 一旦成功认证,AMF向UDM发起位置更新请求,这 些信息可以存储在UDR中; • 5 AMF从...

    gc2035_parrotv1.1_验证完成_vga+uxga_hd720p正常_svga_20171011_1725没有外层目录.7z

    insmod /system/vendor/modules/gc0307.ko # insmod /system/vendor/modules/ov2035.ko insmod /system/vendor/modules/vfe_v4l2.ko 修改为: #csi module # /dev/video0 ov5640 insmod /system/vendor/modules/...

    gitlab-registry-gc:Gitlab注册表垃圾收集器

    用法$ docker run -v yourconfigpath.yaml:/var/grgc/config.yaml herlon214/gitlab-registry-gc:latest> gitlab-registry-gc@1.0.0 start /app> DEBUG=grgc node src/index.jsgrgc Getting token...grgc ...

    GC-6-10-韩武(提交日期:2017-08-04)1

    GC-6-10 定检包/维修项目查看差异1、【查看差异】默认显示当前版本与上一版本的项目方案数据,可选择不同的维修方案版本进行对比。

    GC-2-1-林龙(提交日期:2017-08-011

    GC-2-1 评估单-主列表【列表】当前页面根据机型权限默认显示 当前登录人待处理的数据,需要自己评估的排前面操作:新增,修改,关闭,改版,点击评估单号可链接至

    GC-4-1-岳彬彬(提交日期:2017-08-03) 1

    GC-4-1 技术通告-主列表1、【新增】新增技术通告单技术通告号(非必填项),不填写时后台自动生成,版本默认初始值,颁发日期,主题,版本为必填项,机型根据用户

    vue--cli-plugin-vue2gc:vue2组件生成器

    生成的组件将自动转化为大驼峰命名方式并导出,默认文件目录为 src/components。 npm run gc test-component or yarn gc test-component 上面命令会生成一个包含三个文件的组件: src/components/TestComponent/...

    谨慎使用Java8的默认方法

    为什么要谨慎使用Java8的默认方法?本文给出了为什么要慎用Java8默认方法的原因,解释的很详细,感兴趣的朋友可以参考一下

    GC小帮手「GC little helper」-crx插件

    #me#表示您在日志中的用户名/ TB-Signature和Templates直接在列表中记录缓存快捷方式:F2提交日志,PQ设置,书签表情符号和BBCode在日志字段旁边用户定义的Log-Templates将Tracking-Nummer传输到TB-Log-Field设置...

    PHP session有效期session.gc_maxlifetime

    PHP中的session有效期默认是1440秒(24分钟)【weiweiok 注:php5里默认的是180分】,也就是说,客户端超过24分钟没有刷新,当前session就会失效。很明显,这是不能满足需要的。

    jdk-12_osx-x64_bin.dmg

    默认类数据共享归档文件 针对 64 位平台,使用默认类列表增强 JDK 构建过程以生成类数据共享(class data-sharing,CDS)档。 Abortable Mixed Collections for G1 可中止的 G1 Mixed GC 如果 G1 Mixed GC 存在...

    JVM参数设置详细说明

    在使用CMS gc的时候他有两种触发gc的方式:gc估算触发和heap占用触发。我们的1.5.0.09 环境下有次old 区heap占用在30%左右,她就频繁gc,个人感觉系统估算触发这种方式不靠谱,还是用 heap 使用比率触发比较稳妥。 ...

Global site tag (gtag.js) - Google Analytics