java gc时会暂停运行吗,java gc 项目终止运行

当前位置:我的异常网» 编程 » java gc 项目终止运行

java gc 项目终止运行

www.myexceptions.net  网友分享于:2013-09-03  浏览:6次

java gc 项目停止运行

首先感谢阿宝同学的帮助,我才对这个gc算法的调整有了一定的认识,而不是停留在过去仅仅了解的阶段。在读过sun的文档和跟阿宝讨论之后,做个小小的总结,如果有谬误,敬请指正。

CMS,全称Concurrent Low Pause Collector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenured generation的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少full gc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。在我们的应用中,因为有缓存的存在,并且对于响应时间也有比较高的要求,因此希望能尝试使用CMS来替代默认的server型JVM使用的并行收集器,以便获得更短的垃圾回收的暂停时间,提高程序的响应性。

CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:

初始标记(CMS-initial-mark) -> 并发标记(CMS-concurrent-mark) -> 重新标记(CMS-remark) -> 并发清除(CMS-concurrent-sweep) ->并发重设状态等待下次CMS的触发(CMS-concurrent-reset)。

其中的1,3两个步骤需要暂停所有的应用程序线程的。第一次暂停从root对象开始标记存活的对象,这个阶段称为初始标记;第二次暂停是在并发标记之后,暂停所有应用程序线程,重新标记并发标记阶段遗漏的对象(在并发标记阶段结束后对象状态的更新导致)。第一次暂停会比较短,第二次暂停通常会比较长,并且 remark这个阶段可以并行标记。

而并发标记、并发清除、并发重设阶段的所谓并发,是指一个或者多个垃圾回收线程和应用程序线程并发地运行,垃圾回收线程不会暂停应用程序的执行,如果你有多于一个处理器,那么并发收集线程将与应用线程在不同的处理器上运行,显然,这样的开销就是会降低应用的吞吐量。Remark阶段的并行,是指暂停了所有应用程序后,启动一定数目的垃圾回收进程进行并行标记,此时的应用线程是暂停的。

CMS的young generation的回收采用的仍然是并行复制收集器,这个跟Paralle gc算法是一致的。

下面是参数介绍和遇到的问题总结,

1、启用CMS:-XX:+UseConcMarkSweepGC。 咳咳,这里犯过一个低级错误,竟然将+号写成了-号

2。CMS默认启动的回收线程数目是  (ParallelGCThreads + 3)/4) ,如果你需要明确设定,可以通过-XX:ParallelCMSThreads=20来设定,其中ParallelGCThreads是年轻代的并行收集线程数

3、CMS是不会整理堆碎片的,因此为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection,开启这个选项一定程度上会影响性能,阿宝的blog里说也许可以通过配置适当的CMSFullGCsBeforeCompaction来调整性能,未实践。

4.为了减少第二次暂停的时间,开启并行remark: -XX:+CMSParallelRemarkEnabled。如果remark还是过长的话,可以开启-XX:+CMSScavengeBeforeRemark选项,强制remark之前开始一次minor gc,减少remark的暂停时间,但是在remark之后也将立即开始又一次minor gc。

5.为了避免Perm区满引起的full gc,建议开启CMS回收Perm区选项:

+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled

6.默认CMS是在tenured generation沾满68%的时候开始进行CMS收集,如果你的年老代增长不是那么快,并且希望降低CMS次数的话,可以适当调高此值:

-XX:CMSInitiatingOccupancyFraction=80

这里修改成80%沾满的时候才开始CMS回收。

7.年轻代的并行收集线程数默认是(cpu <=

11413721493.gif ? cpu : 3 + ((cpu * 5) /

11413721493.gif,如果你希望降低这个线程数,可以通过-XX:ParallelGCThreads= N 来调整。

8.进入重点,在初步设置了一些参数后,例如:

Java代码

-server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m

-XX:MaxPermSize=64m -XX:-UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled

-XX:SoftRefLRUPolicyMSPerMB=0

-server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=64m

-XX:MaxPermSize=64m -XX:-UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection

-XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled

-XX:SoftRefLRUPolicyMSPerMB=0

需要在生产环境或者压测环境中测量这些参数下系统的表现,这时候需要打开GC日志查看具体的信息,因此加上参数:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/test/logs/gc.log

在运行相当长一段时间内查看CMS的表现情况,CMS的日志输出类似这样:

Java代码

4391.322: [GC [1 CMS-initial-mark: 655374K(1310720K)] 662197K(1546688K), 0.0303050 secs] [Times: user=0.02 sys=0.02, real=0.03 secs]

4391.352: [CMS-concurrent-mark-start]

4391.779: [CMS-concurrent-mark: 0.427/0.427 secs] [Times: user=1.24 sys=0.31, real=0.42 secs]

4391.779: [CMS-concurrent-preclean-start]

4391.821: [CMS-concurrent-preclean: 0.040/0.042 secs] [Times: user=0.13 sys=0.03, real=0.05 secs]

4391.821: [CMS-concurrent-abortable-preclean-start]

4392.511: [CMS-concurrent-abortable-preclean: 0.349/0.690 secs] [Times: user=2.02 sys=0.51, real=0.69 secs]

4392.516: [GC[YG occupancy: 111001 K (235968 K)]4392.516: [Rescan (parallel) , 0.0309960 secs]4392.547: [weak refs processing, 0.0417710 secs] [1 CMS-remark: 655734K(1310720K)] 766736K(1546688K), 0.0932010 secs] [Times: user=0.17 sys=0.00, real=0.09 secs]

4392.609: [CMS-concurrent-sweep-start]

4394.310: [CMS-concurrent-sweep: 1.595/1.701 secs] [Times: user=4.78 sys=1.05, real=1.70 secs]

4394.310: [CMS-concurrent-reset-start]

4394.364: [CMS-concurrent-reset: 0.054/0.054 secs] [Times: user=0.14 sys=0.06, real=0.06 secs]

4391.322: [GC [1 CMS-initial-mark: 655374K(1310720K)] 662197K(1546688K), 0.0303050 secs] [Times: user=0.02 sys=0.02, real=0.03 secs]

4391.352: [CMS-concurrent-mark-start]

4391.779: [CMS-concurrent-mark: 0.427/0.427 secs] [Times: user=1.24 sys=0.31, real=0.42 secs]

4391.779: [CMS-concurrent-preclean-start]

4391.821: [CMS-concurrent-preclean: 0.040/0.042 secs] [Times: user=0.13 sys=0.03, real=0.05 secs]

4391.821: [CMS-concurrent-abortable-preclean-start]

4392.511: [CMS-concurrent-abortable-preclean: 0.349/0.690 secs] [Times: user=2.02 sys=0.51, real=0.69 secs]

4392.516: [GC[YG occupancy: 111001 K (235968 K)]4392.516: [Rescan (parallel) , 0.0309960 secs]4392.547: [weak refs processing, 0.0417710 secs] [1 CMS-remark: 655734K(1310720K)] 766736K(1546688K), 0.0932010 secs] [Times: user=0.17 sys=0.00, real=0.09 secs]

4392.609: [CMS-concurrent-sweep-start]

4394.310: [CMS-concurrent-sweep: 1.595/1.701 secs] [Times: user=4.78 sys=1.05, real=1.70 secs]

4394.310: [CMS-concurrent-reset-start]

4394.364: [CMS-concurrent-reset: 0.054/0.054 secs] [Times: user=0.14 sys=0.06, real=0.06 secs]

其中可以看到CMS-initial-mark阶段暂停了0.0303050秒,而CMS-remark阶段暂停了0.0932010秒,因此两次暂停的总共时间是0.123506秒,也就是123毫秒左右。两次短暂停的时间之和在200以下可以称为正常现象。

但是你很可能遇到两种fail引起full gc:Prommotion failed和Concurrent mode failed。

Prommotion failed的日志输出大概是这样:

Java代码

[ParNew (promotion failed): 320138K->320138K(353920K), 0.2365970 secs]42576.951: [CMS: 1139969K->1120688K(

166784K), 9.2214860 secs] 1458785K->1120688K(2520704K), 9.4584090 secs]

[ParNew (promotion failed): 320138K->320138K(353920K), 0.2365970 secs]42576.951: [CMS: 1139969K->1120688K(

2166784K), 9.2214860 secs] 1458785K->1120688K(2520704K), 9.4584090 secs]

这个问题的产生是由于救助空间不够,从而向年老代转移对象,年老代没有足够的空间来容纳这些对象,导致一次full gc的产生。解决这个问题的办法有两种完全相反的倾向:增大救助空间、增大年老代或者去掉救助空间。增大救助空间就是调整-XX:SurvivorRatio参数,这个参数是Eden区和Survivor区的大小比值,默认是32,也就是说Eden区是 Survivor区的32倍大小,要注意Survivo是有两个区的,因此Surivivor其实占整个young genertation的1/34。调小这个参数将增大survivor区,让对象尽量在survitor区呆长一点,减少进入年老代的对象。去掉救助空间的想法是让大部分不能马上回收的数据尽快进入年老代,加快年老代的回收频率,减少年老代暴涨的可能性,这个是通过将-XX:SurvivorRatio 设置成比较大的值(比如65536)来做到。在我们的应用中,将young generation设置成256M,这个值相对来说比较大了,而救助空间设置成默认大小(1/34),从压测情况来看,没有出现prommotion failed的现象,年轻代比较大,从GC日志来看,minor gc的时间也在5-20毫秒内,还可以接受,因此暂不调整。

Concurrent mode failed的产生是由于CMS回收年老代的速度太慢,导致年老代在CMS完成前就被沾满,引起full gc,避免这个现象的产生就是调小-XX:CMSInitiatingOccupancyFraction参数的值,让CMS更早更频繁的触发,降低年老代被沾满的可能。我们的应用暂时负载比较低,在生产环境上年老代的增长非常缓慢,因此暂时设置此参数为80。在压测环境下,这个参数的表现还可以,没有出现过Concurrent mode failed。

参考资料:

《JDK5.0垃圾收集优化之--Don't Pause》 by 江南白衣

《记一次Java GC调整经历》1,2 by Arbow

Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning

Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine

文章评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 取消页面一些样式,jquery如何去除样式

jquery去除样式的方法&#xff1a;1、使用【removeClass()】方法&#xff0c;代码为【removeClass(function(index,class))】&#xff1b;2、使用toggleClass方法&#xff0c;代码为【toggleClass(class)】。本教程操作环境&#xff1a;windows7系统、jquery3.2.1版&#xff0c…

matlab对经济指标分析,经济背景下的数据预测分析--基于matlab建模(郑铿城)

1、经济预测概述经济预测有三个要素&#xff0c;实际资料是预测的依据&#xff1b;经济理论是预测的基础&#xff1b;数学模型是预测的手段&#xff1b;经济预测的内容包括生产和资源预测&#xff0c;市场预测&#xff0c;国民收入分配预测&#xff0c;居民生活质量预测等。预测…

php nginx 静态资源,Nginx实践篇(1)- Nginx作为静态资源web服务 - 静态资源压缩

一、静态资源web服务1. 静态资源类型类型文件类型浏览器端渲染HTML、CSS、JS图片JEPG、GIF、PNG视频FLV、MPEG文件TXT等其他下载文件2. 静态资源服务场景-CDN二、静态资源核心配置1. 文件读取 sendfilesendfile 是一种高效传输文件的模式.sendfile设置为on表示启动高效传输文件…

php将get传参解析成数组,php解析url (parse_url) 参数成数组 (parse_str)

今天首先让我们为天津8.12大爆炸和陕西山阳山体滑坡遇难的同胞默哀3分钟&#xff0c;祝愿受伤的群众早日康复&#xff0c;脱离危险&#xff0c;希望国家严惩事故责任人&#xff0c;安抚受损群众。希望杯具以后不再发生……最近天灾人祸&#xff0c;大家出行一定要注意安全&…

猛将赵云java,这五位三国猛将临危救主,赵云只能排第二位,第一位大家都服...

曹洪&#xff0c;曹子廉。是曹操的从弟&#xff0c;在《三国演义》小说中&#xff0c;最早跟随曹操起兵&#xff0c;虽然战斗力没有一流战将那么强悍&#xff0c;但是此人在曹操起兵讨伐董卓时&#xff0c;曹操在荥阳被徐荣打败&#xff0c;坐骑丢失。正要被徐荣士兵解决的时刻…

用python画三维图、某区域的高程,python - 在PyQt中绘制具有高程和降低效果的3D矩形/多边形 - SO中文参考 - www.soinside.com...

据我所知&#xff0c;没有内置的PyQt 3D绘制小部件/功能&#xff0c;因为您只能绘制2D多边形。但我们可以创建一个自定义类来模拟3D绘画。从您的Java链接reference&#xff1a;Java支持3D矩形&#xff0c;但第三维的效果不是很明显。由于海拔较低&#xff0c;效果可以忽略不计。…

2024年PMP考试新考纲-PMBOK第七版-项目管理原则真题解析(续3)

马上就要进入2024年了&#xff0c;要参加2024年PMP一季度考试的小伙伴可以准备起来了。2024年的PMP考试将继续采用新考试大纲&#xff0c;考试内容包括PMBOK第六版、PMBOK第七版和敏捷实践指南&#xff0c;而且敏捷&#xff08;或者叫混合&#xff09;的项目环境将占比超过50%&…

linux 串口信息记到日志,[linux学习笔记]之一:ubuntu ch340调试备忘

[linux学习笔记]之一&#xff1a;ubuntu ch340调试备忘已有 2183 次阅读2016-11-8 21:52|个人分类:linux最近迷上了Linux&#xff0c;入了一块板。电脑使用win7ubuntu 双系统&#xff0c;可是调试的时候就麻烦了&#xff0c;ubuntu下写好sd卡镜像&#xff0c;调试的时候还要切换…

嵌入式linux 配置usb otg,嵌入式linux系统环境下USB设备的驱动实现

0 引言嵌入式linux系统环境以其易于移植裁减、内核小、效率高、完整、原代码开放及性能优异等特点&#xff0c;在嵌入式领域得到了非常广泛的应用。Linux的USB设备端的源代码中主要有USB device的海量存储设备、串口设备、网络设备等设备驱动程序及各种USB device控制器芯片的…

linux 上下文切换监控,[Linux] 查看进程的上下文切换pidstat

各个进程之间是共享 CPU 资源的&#xff0c;在不同的时候进程之间需要切换&#xff0c;让不同的进程可以在 CPU 执行&#xff0c;那么这个一个进程切换到另一个进程运行&#xff0c;称为进程的上下文切换。进程是由内核管理和调度的&#xff0c;所以进程的切换只能发生在内核态…

linux怎么休眠快捷键,在Deepin系统中创建右键休眠选项的方法

本文介绍在深度Deepin操作系统中创建右键休眠选项&#xff0c;以方便你更快的进入到系统休眠当中&#xff0c;实现方法非常简单&#xff0c;按照下面的步骤进行就可以了。休眠的好处系统休眠&#xff0c;可以让平时的工作环境保存到硬盘中&#xff0c;以便开机后便可立即进入工…

android 自定义推流器,Android直播实现 Android端推流、播放

最近想实现一个Android直播&#xff0c;但是对于这方面的资料都比较零碎&#xff0c;一开始是打算用ffmpeg来实现编码推流&#xff0c;在搜集资料期间&#xff0c;找到了几个强大的开源库&#xff0c;直接避免了jni的代码&#xff0c;集成后只用少量的java代码就可实现编码、推…

android 聊天功能实现,Android聊天背景功能实现

解决输入法弹出时背景被顶上去或者挤压变形的问题先看效果图&#xff1a;Screenshot_1510219375.pngScreenshot_1510219378.png实现方案&#xff1a;package com.qiangqiang.chatback.views;import android.content.Context;import android.util.AttributeSet;import android.v…

小技巧来助阵 玩转Google Chrome(谷歌浏览器)

核心提示&#xff1a;Google Chrome是由Google开发的一款设计简单、高效的Web浏览工具。 Chrome问世已经有段时间了&#xff0c;相关的应用技巧也开始被挖掘出来&#xff0c;这里小编教你3则小技巧&#xff0c;让Chrome更满足你的需求。 1、单进程运行&#xff1a;Chrome的多…

谷歌浏览器怎么下载视频 Google Chrome下载视频方法

核心提示&#xff1a;现在我来教大家谷歌浏览器怎么下载视频 Google Chrome下载视频方法。 谷歌浏览器怎么下载视频 Google Chrome下载视频方法 我们经常会在线看一些网页视频&#xff0c;但是网站的视频下载都只支持自己的客户端&#xff0c;如果每家网站的客户端都安装的话那…

android 日程安排view,RecyclerView 列表控件中简单实现时间线

时间时间&#xff0c;时间&#xff0c;时间啊&#xff1b;走慢一点吧&#xff5e;看见很多软件中都有时间线的东西&#xff0c;貌似天气啊&#xff0c;旅游啊什么的最多了&#xff1b;具体实现方式很多&#xff0c;在本篇文章中讲解一种自定义View封装的方式。效果先来看看效果…

android rxjava2 简书,RXJava2学习

什么是RxJava一个可观测的序列来组成异步的、基于事件的程序的库。(简单来说&#xff1a;它就是一个实现异步操作的库)RxJava 好在哪?RxJava 其实就是提供一套异步编程的 API&#xff0c;这套 API 是基于观察者模式的&#xff0c;而且是链式调用的&#xff0c;所以使用 RxJava…

无尽包围html5游戏在线玩,小团体激发潜能小游戏突破自我

缩小包围圈游戏其实是一个不可能完成的任务&#xff0c;但是它会给游戏者带来无尽欢笑&#xff0c;使小组充满活力&#xff0c;让队员们能够自然地进行身体接触和配合&#xff0c;消除害羞和忸怩感&#xff0c;创造融洽的气氛&#xff0c;为后续工作的开展奠定良好基础。可以作…

html5鼠标下拉浮窗固定,【前端技术】vue-floating-menu可拖拽吸附的浮窗菜单

前言正如这个名字&#xff0c;这是一个具有拖拽吸附功能的浮窗菜单&#xff0c;开源项目一个基于 vue 的浮窗组件,可在屏幕内自由拖拽&#xff0c;拖拽后可以根据最后的位置吸附到页面两边&#xff0c;而且可以点击浮窗显示菜单效果如下:遇到的问题总结鼠标移动过快&#xff0c…

html vba 单元格 格式,VBA设置单元格格式之——字体

009 设置单元格格式之字体(文档下载&#xff1a;关注本公众号&#xff0c;发送消息【教程】即可获得)通过VBA对单元格字体进行设置也是比较常用的方式&#xff0c;那么本节内容我们就来学习如何使用VBA对单元格中的字体进行设置。如图所示&#xff0c;字体设置主要有&#xff0…