- 浏览: 395455 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (760)
- 股票日志 (26)
- Selenium (0)
- selenium 2 环境的搭建 (1)
- 并发 (7)
- 框架开发 (1)
- 动态代理 (2)
- Struts2 (2)
- POI (2)
- jdk (3)
- maven (31)
- spring (35)
- mysql (31)
- 工作机会 (3)
- xtream (1)
- oracle dbms_metadata GET_DDL (0)
- SSI (1)
- DB (61)
- powermock (4)
- java 基础 (25)
- 多线程 (11)
- 高手 (2)
- java 底层 (2)
- 专业网站 (1)
- 开发联想 (1)
- 开发联想 (1)
- bat文件 (2)
- 清queue 语句 (1)
- 清queue 语句 (1)
- jquery (7)
- html5 (1)
- Jenkins (10)
- Linux (17)
- 工作issue (2)
- tomcat log (3)
- jvm (23)
- 项目细节 (0)
- oracle (41)
- 泛型 (3)
- 新知识点 (1)
- 数据库ddl 语句 (0)
- AQ (2)
- jms (0)
- 网络资源 (6)
- github (6)
- Easymock (1)
- Dom 解析XML (1)
- windows命令 (2)
- java (7)
- 正则表达式 (5)
- sequence (1)
- oracle 表meta信息 (1)
- 小工具技巧 (1)
- 辅助工具 (1)
- Junit (1)
- 泛型 generic (2)
- Java程序设计 (1)
- cglib (2)
- 架构师之路 (1)
- 数据库连接池 (5)
- c3p0 (1)
- eclipse使用 (1)
- oracle sql plus (1)
- 码农人生 (3)
- SVN (15)
- sqlplus (2)
- jsoup (1)
- 网络爬虫 (2)
- 新技能 (1)
- zookeeper (4)
- hadoop (1)
- SVNKIT (1)
- 从工具到知识点的整理 (1)
- log4j (13)
- 读文件 (0)
- 转义字符 (1)
- command (1)
- web service (3)
- 锁 (1)
- shell 脚本 (1)
- 遇到的错误 (2)
- tomcat (14)
- 房产 (5)
- bootstrap jquery ui (1)
- easyui (2)
- 个人征信 (1)
- 读写分离 (1)
- 备份 (1)
- rmi (6)
- webservice (1)
- JMX (4)
- 内存管理 (3)
- java设计 (1)
- timer (1)
- lock (2)
- concurrent (2)
- collection (1)
- tns (1)
- java基础 (15)
- File (1)
- 本机资源 (1)
- bat (1)
- windows (4)
- 数据结构 (3)
- 代码安全 (1)
- 作用域 (1)
- 图 (2)
- jvm内存结构 (1)
- 计算机思想 (1)
- quartz (6)
- Mongo DB (2)
- Nosql (4)
- sql (5)
- 第三方Java 工具 jar 项目 (2)
- drools (1)
- java swing (2)
- 调用console (1)
- runtime (1)
- process (1)
- swing (2)
- grouplayout (1)
- dubbo (0)
- bootstrap (0)
- nodejs (2)
- SVN hooks (1)
- jdbc (3)
- jdbc error (1)
- precedure (1)
- partition_key (1)
- active mq (1)
- blob (2)
- Eclipse (6)
- web server (1)
- bootstrapt (2)
- struts (1)
- ajax (1)
- js call back (1)
- 思想境界拓展 (1)
- JIRA (1)
- log (1)
- jaxb (3)
- xml java互相转换 (1)
- 装修 (2)
- 互联网 (2)
- threadlocal (3)
- mybatis (22)
- xstream (1)
- 排序 (1)
- 股票资源 (1)
- RPC (2)
- NIO (3)
- http client (6)
- 他人博客 (1)
- 代理服务器 (1)
- 网络 (2)
- web (1)
- 股票 (5)
- deadlock (1)
- JConsole (2)
- activemq (3)
- oralce (1)
- 游标 (1)
- 12月13日道富内部培训 (0)
- grant (1)
- 速查 (2)
- classloader (4)
- netty (4)
- 设计模式 (2)
- 缓存 (2)
- ehcache (2)
- framework (1)
- 内存分析 (2)
- dump (1)
- memory (2)
- 多高线程,并发 (1)
- hbase (2)
- 分布式系统 (1)
- socket (3)
- socket (1)
- 面试问题 (1)
- jetty (2)
- http (2)
- 源码 (1)
- 日志 (2)
- jni (1)
- 编码约定 (1)
- memorycache (1)
- redis (13)
- 杂谈 (1)
- drool (1)
- blockingqueue (1)
- ScheduledExecutorService (1)
- 网页爬虫 (1)
- httpclient (4)
- httpparser (1)
- map (1)
- 单例 (1)
- synchronized (2)
- thread (1)
- job (1)
- hashcode (1)
- copyonwriteArrayList (2)
- 录制声音 (1)
- java 标准 (2)
- SSL/TLS (1)
- itext (1)
- pdf (1)
- 钻石 (2)
- sonar (1)
- unicode (1)
- 编码 (4)
- html (1)
- SecurityManager (1)
- 坑 (1)
- Restful (2)
- svn hook (1)
- concurrentHashMap (1)
- 垃圾回收 (1)
- vbs (8)
- visual svn (2)
- power shell (1)
- wmi (3)
- mof (2)
- c# (1)
- concurrency (1)
- 劳动法 (1)
- 三国志游戏 (2)
- 三国 (1)
- 洪榕 (2)
- 金融投资知识 (1)
- motan (1)
- tkmybatis mapper (1)
- 工商注册信息查询 (1)
- consul (1)
- 支付业务知识 (2)
- 数据库备份 (1)
- 字段设计 (1)
- 字段 (1)
- dba (1)
- 插件 (2)
- PropEdit插件 (1)
- web工程 (1)
- 银行业知识 (2)
- 国内托管银行 (1)
- 数据库 (1)
- 事务 (2)
- git (18)
- component-scan (1)
- 私人 (0)
- db2 (14)
- alias (1)
- 住房 (1)
- 户口 (1)
- fastjson (1)
- test (6)
- RSA (2)
- 密钥 (1)
- putty (1)
- sftp (1)
- 加密 (1)
- 公钥私钥 (3)
- markdown (1)
- sweet (1)
- sourcetree (1)
- 好工具 (1)
- cmd (1)
- scp (1)
- notepad++ (1)
- ssh免密登录 (1)
- https (1)
- ssl (2)
- js (2)
- h2 (1)
- 内存 (2)
- 浏览器 (1)
- js特效 (1)
- io (1)
- 乱码 (1)
- 小工具 (1)
- 每周技术任务 (1)
- mongodb (7)
- 内存泄漏 (1)
- 码云 (2)
- 如何搭建java 视频服务器 tomcat (1)
- 资源 (1)
- 书 (1)
- 四色建模法 (1)
- 建模 (1)
- 配置 (1)
- 职位 (1)
- nginx (1)
- excel (1)
- log4j2 (2)
- 做菜 (1)
- jmap (1)
- jspwiki (1)
- activiti (1)
- 工作流引擎 (1)
- 安卓 (1)
- acitviti 例子 (1)
- 二维码 (1)
- 工作流 (1)
- powerdesign (2)
- 软件设计 (1)
- 乐观锁 (1)
- 王者荣耀 (1)
- session (2)
- token (5)
- cookie (4)
- springboot (24)
- jwt (2)
- 项目路径 (1)
- magicbook (1)
- requestType (1)
- json (2)
- swagger (1)
- eolinker (1)
- springdata (1)
- springmvc (1)
- controlleradvice (1)
- profile (1)
- 银行四要素 (1)
- 支付人员资源 (1)
- 支付渠道 (1)
- yaml (1)
- 中文编码 (1)
- mongo (2)
- serializable (1)
- 序列化 (1)
- zyd (1)
- unittest (1)
- 工具 (1)
- Something (1)
- 通达信 (1)
- protobuf (1)
- 算法 (1)
- springcloud (2)
- hikari (1)
- rocketmq (7)
- cachecloud (1)
- serfj (1)
- axure (1)
- lombok (1)
- 分布式锁 (1)
- 线程 (2)
- 同步代码块 (1)
- cobar (1)
- mq (1)
- rabbitmq (1)
- 定时执行 (1)
- 支付系统 (3)
- 唱歌 (1)
- elasticjob (1)
- 定时任务 (1)
- 界面 (1)
- flink (2)
- 大数据 (1)
- 接私活 (0)
- 内部培训 (2)
最新评论
-
dannyhz:
做股票从短线 试水,然后 慢慢发现 波段和 中期的故事可挖, ...
搭台唱戏 -
dannyhz:
http://developer.51cto.com/art/ ...
如何自己开发框架 它的注意点是什么
http://www.importnew.com/13954.html
[HotSpot VM] 如何降低新生代GC时间?
whb1984的博客
whb1984 2014-10-21
R大及各位好,简单描述下状况:
系统上线10几个小时,CMS回收只有一次还可以接受,现在的问题是minor GC 时间随着系统运行时间越来越长,大部分超过了0.1s。而且大致是随着老年代的内存增加,minor GC时间逐步变长。以我的理解新生代的GC回收时间应该和老年代的占用内存大小没什么关系吧,为啥minor GC时间会越来越长呢?
机器配置:
cpu: Intel(R) Xeon(R) CPU E5430 @ 2.66GHz × 8
memory: 16G
jvm启动参数:
-server -Xloggc:./log/gcviewer.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbosegc -Xms2048M -Xmx2048M -Xmn190M -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+AggressiveOpts -XX:MaxGCPauseMillis=100 -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=128M -XX:MaxPermSize=256M
gcviewer截图:灰色部分为GC时间,蓝色为内存增长。
截出部分gc日志:
刚开始时:开始还可以接受,0.02~0.03s
2014-10-21T16:12:00.390+0800: 333.022: [GC 333.022: [ParNew: 169158K->17105K(175104K), 0.0196470 secs] 853779K->701725K(2077696K), 0.0203990 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2014-10-21T16:12:02.701+0800: 335.333: [GC 335.333: [ParNew: 172753K->14227K(175104K), 0.0230520 secs] 857373K->698847K(2077696K), 0.0238350 secs] [Times: user=0.15 sys=0.00, real=0.03 secs]
2014-10-21T16:12:04.020+0800: 336.652: [GC 336.652: [ParNew: 169875K->16849K(175104K), 0.0217180 secs] 854495K->701470K(2077696K), 0.0224960 secs] [Times: user=0.14 sys=0.00, real=0.02 secs]
2014-10-21T16:12:05.425+0800: 338.057: [GC 338.057: [ParNew: 172497K->17403K(175104K), 0.0208420 secs] 857118K->702024K(2077696K), 0.0215930 secs] [Times: user=0.16 sys=0.00, real=0.03 secs]
2014-10-21T16:12:06.712+0800: 339.344: [GC 339.345: [ParNew: 173051K->15236K(175104K), 0.0201730 secs] 857672K->699857K(2077696K), 0.0209250 secs] [Times: user=0.15 sys=0.00, real=0.02 secs]
2014-10-21T16:12:08.034+0800: 340.666: [GC 340.667: [ParNew: 170884K->17870K(175104K), 0.0200380 secs] 855505K->702491K(2077696K), 0.0208180 secs] [Times: user=0.15 sys=0.01, real=0.02 secs]
2014-10-21T16:12:09.602+0800: 342.234: [GC 342.235: [ParNew: 173518K->16237K(175104K), 0.0223470 secs] 858139K->700858K(2077696K), 0.0230970 secs] [Times: user=0.17 sys=0.00, real=0.03 secs]
2014-10-21T16:12:11.041+0800: 343.673: [GC 343.674: [ParNew: 171885K->19456K(175104K), 0.0208920 secs] 856506K->704101K(2077696K), 0.0216500 secs] [Times: user=0.15 sys=0.00, real=0.02 secs]
运行一段时间:慢慢升高,已经0.12s了
2014-10-21T20:58:10.920+0800: 17503.552: [GC 17503.553: [ParNew: 175104K->18907K(175104K), 0.1173460 secs] 1065519K->909322K(2077696K), 0.1181020 secs] [Times: user=0.91 sys=0.01, real=0.12 secs]
2014-10-21T20:58:17.784+0800: 17510.416: [GC 17510.417: [ParNew: 174555K->18403K(175104K), 0.1167540 secs] 1064970K->908818K(2077696K), 0.1175530 secs] [Times: user=0.92 sys=0.00, real=0.12 secs]
2014-10-21T20:58:23.240+0800: 17515.872: [GC 17515.872: [ParNew: 174051K->16445K(175104K), 0.1189100 secs] 1064466K->906861K(2077696K), 0.1197100 secs] [Times: user=0.92 sys=0.01, real=0.12 secs]
2014-10-21T20:58:31.390+0800: 17524.022: [GC 17524.022: [ParNew: 172093K->19456K(175104K), 0.1188790 secs] 1062509K->909974K(2077696K), 0.1196710 secs] [Times: user=0.93 sys=0.00, real=0.12 secs]
2014-10-21T20:58:35.824+0800: 17528.456: [GC 17528.457: [ParNew: 175104K->18279K(175104K), 0.1181890 secs] 1065622K->908798K(2077696K), 0.1189490 secs] [Times: user=0.93 sys=0.00, real=0.12 secs]
2014-10-21T20:58:44.207+0800: 17536.839: [GC 17536.840: [ParNew: 173927K->16366K(175104K), 0.1174270 secs] 1064446K->906884K(2077696K), 0.1182030 secs] [Times: user=0.92 sys=0.00, real=0.12 secs]
最高的一段时间:大概快到了0.2s了。
2014-10-22T03:36:12.582+0800: 41385.215: [GC 41385.215: [ParNew: 175104K->19456K(175104K), 0.1745820 secs] 692711K->537299K(2077696K), 0.1754410 secs] [Times: user=1.37 sys=0.00, real=0.18 secs]
2014-10-22T03:36:19.549+0800: 41392.181: [GC 41392.182: [ParNew: 175104K->19456K(175104K), 0.1753550 secs] 692947K->537562K(2077696K), 0.1761940 secs] [Times: user=1.38 sys=0.00, real=0.18 secs]
2014-10-22T03:36:25.216+0800: 41397.848: [GC 41397.848: [ParNew: 175104K->19456K(175104K), 0.1746610 secs] 693210K->537878K(2077696K), 0.1754360 secs] [Times: user=1.37 sys=0.01, real=0.18 secs]
2014-10-22T03:36:29.907+0800: 41402.539: [GC 41402.539: [ParNew: 175104K->19456K(175104K), 0.1751190 secs] 693526K->538168K(2077696K), 0.1759340 secs] [Times: user=1.38 sys=0.01, real=0.17 secs]
2014-10-22T03:36:35.684+0800: 41408.317: [GC 41408.317: [ParNew: 175104K->19456K(175104K), 0.1750010 secs] 693816K->538480K(2077696K), 0.1758160 secs] [Times: user=1.38 sys=0.00, real=0.18 secs]
2014-10-22T03:36:40.335+0800: 41412.967: [GC 41412.967: [ParNew: 175104K->19456K(175104K), 0.1753520 secs] 694128K->538801K(2077696K), 0.1761410 secs] [Times: user=1.38 sys=0.01, real=0.18 secs]
最后总结下问题:
1. jvm参数设置及垃圾收集器设置是否合理?
2. 为什么minor gc时间会越来越长(190m的新生代,每次gc花费0.1s~0.2s的时间是什么概念? 是否属于时间过长?)
3. 如何减少minor gc时间? (现在cms gc时间可以忽略不计,主要是minor gc时间过长)
Spinner
youlong699的博客
youlong699 2014-10-22
-Xmn190M 太小了点。 目测你的S区每次都被占满,这样每次minorgc会有大量对象被promotion到old区。可以用jstat -gcutil 看下S0/S1的占用率
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
建议,尝试增大Xmn . 如果你有比较大量的长寿对象,比如一些缓存之类的,old是要占用比例较大,但是你这个比例未免差异太大了 :)
Spinner
whb1984的博客
whb1984 2014-10-22
youlong699 写道
-Xmn190M 太小了点。 目测你的S区每次都被占满,这样每次minorgc会有大量对象被promotion到old区。可以用jstat -gcutil 看下S0/S1的占用率
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
建议,尝试增大Xmn . 如果你有比较大量的长寿对象,比如一些缓存之类的,old是要占用比例较大,但是你这个比例未免差异太大了 :)
感觉上面朋友的回复,关于你说的原因我再补充说明下:
引用
随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长
1. 这个根据上面的gcviewer图和gc日志能看到,在jvm的第一次cms之前,minorgc的时间就已经能够达到0.12s左右,这个时候jvm还没做过cms,所以是不是可以排除和cms的关系呢?
2. "old区可用内存减少,在old区分配空间耗时会变长",这个原因是什么呢? 是因为minor gc会发生old promotion操作吗?但是比如下面这次minorgc,新生代回收的内存和总的内存回收一样多(175104 - 18907 = 1065519 - 909322),说明是没有发生promotion,但是gc时间也要0.12s。像这种没有promotion的minorgc还有很多,而且时间也比较长。
引用
2014-10-21T20:58:10.920+0800: 17503.552: [GC 17503.553: [ParNew: 175104K->18907K(175104K), 0.1173460 secs] 1065519K->909322K(2077696K), 0.1181020 secs] [Times: user=0.91 sys=0.01, real=0.12 secs]
3. 关于增大young generation size。这个也尝试过,可以说,新生代分配的内存增大,minorgc频率会变低,单次gc time会变长,但总体来说throughput会有提高。 但是现在我们把throughput放在第二位,只是希望minor gc 能降低些,哪怕牺牲些throughput。 关于新生代190m内存其实还可以降低,但是再低些会导致gc过于频繁,吞吐量降低太多,这也是不太可取。
这是我的一些个人理解,希望大家能给些建议。
Spinner
pulsar_lxl的博客
pulsar_lxl 2014-11-05
我遇到的问题和楼主类似,我的基本配置是Xmx=3g, NewRatio=8, parNew + CMS,随着老年代使用内存不断增加,响应时间逐渐变长,系统吞吐也下降的厉害。
youlong699 写道
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
这位仁兄的说法有什么理论依据没有,我只知道CMS使用空闲链表分配内存,空闲链表相对碰撞指针性能有下降,但是不知道随着old区内存使用量越来越多,空闲链表分配性能会越来越低吗?
Spinner
xxd82329的博客
xxd82329 2014-11-13
简单的说,做Minor GC的时候,JVM必须要扫描Old gen,因为Old gen里面的对象可能会有指向Young gen的引用。所以,当Old gen越来越大的时候,这种扫描所花的时间也就会越来越多了。
本人也同意第一位朋友的说法,Young gen设的太小了。一般来说,我倾向于把Young gen设到Heap的三分之一,甚至有时候会到二分之一。。。
希望对楼主有用。
Spinner
youlong699的博客
youlong699 2015-02-03
看到gc maillist里提到这个话题,想到这个帖子,顺道来贴一下再。
总结来说,就是perm gen 、code cache增大,由于需要扫描其对young gen的引用,导致扫描时间变长:
http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2015-January/002100.html
Spinner
rink1969的博客
rink1969 2015-02-13
最近也遇到一个类似现象的问题,补充一下,方便大家查找。
我那个问题最后发现是jvmti agent的问题。agent里面持续创建了很多jvmti对象和jni对象。这些也是strong root,要在YGC的时候扫描的。
但是经过一次CMS GC之后,这些都回收掉了,YGC就正常了。
Spinner
fh63045的博客
fh63045 2015-03-24
-server -Xloggc:./log/gcviewer.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbosegc -Xms2048M -Xmx2048M -Xmn190M -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+AggressiveOpts -XX:MaxGCPauseMillis=100 -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=128M -XX:MaxPermSize=256M
1. 新生代太小, 通用设置1-1.5倍FGC后老年代大小
2. 设置年龄太长了 使用 -XX:+PrintTenuringDistribution 判断具体年龄分布.
引用
[HotSpot VM] 如何降低新生代GC时间?
whb1984的博客
whb1984 2014-10-21
R大及各位好,简单描述下状况:
系统上线10几个小时,CMS回收只有一次还可以接受,现在的问题是minor GC 时间随着系统运行时间越来越长,大部分超过了0.1s。而且大致是随着老年代的内存增加,minor GC时间逐步变长。以我的理解新生代的GC回收时间应该和老年代的占用内存大小没什么关系吧,为啥minor GC时间会越来越长呢?
机器配置:
cpu: Intel(R) Xeon(R) CPU E5430 @ 2.66GHz × 8
memory: 16G
jvm启动参数:
-server -Xloggc:./log/gcviewer.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbosegc -Xms2048M -Xmx2048M -Xmn190M -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+AggressiveOpts -XX:MaxGCPauseMillis=100 -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=128M -XX:MaxPermSize=256M
gcviewer截图:灰色部分为GC时间,蓝色为内存增长。
截出部分gc日志:
刚开始时:开始还可以接受,0.02~0.03s
2014-10-21T16:12:00.390+0800: 333.022: [GC 333.022: [ParNew: 169158K->17105K(175104K), 0.0196470 secs] 853779K->701725K(2077696K), 0.0203990 secs] [Times: user=0.13 sys=0.00, real=0.02 secs]
2014-10-21T16:12:02.701+0800: 335.333: [GC 335.333: [ParNew: 172753K->14227K(175104K), 0.0230520 secs] 857373K->698847K(2077696K), 0.0238350 secs] [Times: user=0.15 sys=0.00, real=0.03 secs]
2014-10-21T16:12:04.020+0800: 336.652: [GC 336.652: [ParNew: 169875K->16849K(175104K), 0.0217180 secs] 854495K->701470K(2077696K), 0.0224960 secs] [Times: user=0.14 sys=0.00, real=0.02 secs]
2014-10-21T16:12:05.425+0800: 338.057: [GC 338.057: [ParNew: 172497K->17403K(175104K), 0.0208420 secs] 857118K->702024K(2077696K), 0.0215930 secs] [Times: user=0.16 sys=0.00, real=0.03 secs]
2014-10-21T16:12:06.712+0800: 339.344: [GC 339.345: [ParNew: 173051K->15236K(175104K), 0.0201730 secs] 857672K->699857K(2077696K), 0.0209250 secs] [Times: user=0.15 sys=0.00, real=0.02 secs]
2014-10-21T16:12:08.034+0800: 340.666: [GC 340.667: [ParNew: 170884K->17870K(175104K), 0.0200380 secs] 855505K->702491K(2077696K), 0.0208180 secs] [Times: user=0.15 sys=0.01, real=0.02 secs]
2014-10-21T16:12:09.602+0800: 342.234: [GC 342.235: [ParNew: 173518K->16237K(175104K), 0.0223470 secs] 858139K->700858K(2077696K), 0.0230970 secs] [Times: user=0.17 sys=0.00, real=0.03 secs]
2014-10-21T16:12:11.041+0800: 343.673: [GC 343.674: [ParNew: 171885K->19456K(175104K), 0.0208920 secs] 856506K->704101K(2077696K), 0.0216500 secs] [Times: user=0.15 sys=0.00, real=0.02 secs]
运行一段时间:慢慢升高,已经0.12s了
2014-10-21T20:58:10.920+0800: 17503.552: [GC 17503.553: [ParNew: 175104K->18907K(175104K), 0.1173460 secs] 1065519K->909322K(2077696K), 0.1181020 secs] [Times: user=0.91 sys=0.01, real=0.12 secs]
2014-10-21T20:58:17.784+0800: 17510.416: [GC 17510.417: [ParNew: 174555K->18403K(175104K), 0.1167540 secs] 1064970K->908818K(2077696K), 0.1175530 secs] [Times: user=0.92 sys=0.00, real=0.12 secs]
2014-10-21T20:58:23.240+0800: 17515.872: [GC 17515.872: [ParNew: 174051K->16445K(175104K), 0.1189100 secs] 1064466K->906861K(2077696K), 0.1197100 secs] [Times: user=0.92 sys=0.01, real=0.12 secs]
2014-10-21T20:58:31.390+0800: 17524.022: [GC 17524.022: [ParNew: 172093K->19456K(175104K), 0.1188790 secs] 1062509K->909974K(2077696K), 0.1196710 secs] [Times: user=0.93 sys=0.00, real=0.12 secs]
2014-10-21T20:58:35.824+0800: 17528.456: [GC 17528.457: [ParNew: 175104K->18279K(175104K), 0.1181890 secs] 1065622K->908798K(2077696K), 0.1189490 secs] [Times: user=0.93 sys=0.00, real=0.12 secs]
2014-10-21T20:58:44.207+0800: 17536.839: [GC 17536.840: [ParNew: 173927K->16366K(175104K), 0.1174270 secs] 1064446K->906884K(2077696K), 0.1182030 secs] [Times: user=0.92 sys=0.00, real=0.12 secs]
最高的一段时间:大概快到了0.2s了。
2014-10-22T03:36:12.582+0800: 41385.215: [GC 41385.215: [ParNew: 175104K->19456K(175104K), 0.1745820 secs] 692711K->537299K(2077696K), 0.1754410 secs] [Times: user=1.37 sys=0.00, real=0.18 secs]
2014-10-22T03:36:19.549+0800: 41392.181: [GC 41392.182: [ParNew: 175104K->19456K(175104K), 0.1753550 secs] 692947K->537562K(2077696K), 0.1761940 secs] [Times: user=1.38 sys=0.00, real=0.18 secs]
2014-10-22T03:36:25.216+0800: 41397.848: [GC 41397.848: [ParNew: 175104K->19456K(175104K), 0.1746610 secs] 693210K->537878K(2077696K), 0.1754360 secs] [Times: user=1.37 sys=0.01, real=0.18 secs]
2014-10-22T03:36:29.907+0800: 41402.539: [GC 41402.539: [ParNew: 175104K->19456K(175104K), 0.1751190 secs] 693526K->538168K(2077696K), 0.1759340 secs] [Times: user=1.38 sys=0.01, real=0.17 secs]
2014-10-22T03:36:35.684+0800: 41408.317: [GC 41408.317: [ParNew: 175104K->19456K(175104K), 0.1750010 secs] 693816K->538480K(2077696K), 0.1758160 secs] [Times: user=1.38 sys=0.00, real=0.18 secs]
2014-10-22T03:36:40.335+0800: 41412.967: [GC 41412.967: [ParNew: 175104K->19456K(175104K), 0.1753520 secs] 694128K->538801K(2077696K), 0.1761410 secs] [Times: user=1.38 sys=0.01, real=0.18 secs]
最后总结下问题:
1. jvm参数设置及垃圾收集器设置是否合理?
2. 为什么minor gc时间会越来越长(190m的新生代,每次gc花费0.1s~0.2s的时间是什么概念? 是否属于时间过长?)
3. 如何减少minor gc时间? (现在cms gc时间可以忽略不计,主要是minor gc时间过长)
Spinner
youlong699的博客
youlong699 2014-10-22
-Xmn190M 太小了点。 目测你的S区每次都被占满,这样每次minorgc会有大量对象被promotion到old区。可以用jstat -gcutil 看下S0/S1的占用率
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
建议,尝试增大Xmn . 如果你有比较大量的长寿对象,比如一些缓存之类的,old是要占用比例较大,但是你这个比例未免差异太大了 :)
Spinner
whb1984的博客
whb1984 2014-10-22
youlong699 写道
-Xmn190M 太小了点。 目测你的S区每次都被占满,这样每次minorgc会有大量对象被promotion到old区。可以用jstat -gcutil 看下S0/S1的占用率
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
建议,尝试增大Xmn . 如果你有比较大量的长寿对象,比如一些缓存之类的,old是要占用比例较大,但是你这个比例未免差异太大了 :)
感觉上面朋友的回复,关于你说的原因我再补充说明下:
引用
随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长
1. 这个根据上面的gcviewer图和gc日志能看到,在jvm的第一次cms之前,minorgc的时间就已经能够达到0.12s左右,这个时候jvm还没做过cms,所以是不是可以排除和cms的关系呢?
2. "old区可用内存减少,在old区分配空间耗时会变长",这个原因是什么呢? 是因为minor gc会发生old promotion操作吗?但是比如下面这次minorgc,新生代回收的内存和总的内存回收一样多(175104 - 18907 = 1065519 - 909322),说明是没有发生promotion,但是gc时间也要0.12s。像这种没有promotion的minorgc还有很多,而且时间也比较长。
引用
2014-10-21T20:58:10.920+0800: 17503.552: [GC 17503.553: [ParNew: 175104K->18907K(175104K), 0.1173460 secs] 1065519K->909322K(2077696K), 0.1181020 secs] [Times: user=0.91 sys=0.01, real=0.12 secs]
3. 关于增大young generation size。这个也尝试过,可以说,新生代分配的内存增大,minorgc频率会变低,单次gc time会变长,但总体来说throughput会有提高。 但是现在我们把throughput放在第二位,只是希望minor gc 能降低些,哪怕牺牲些throughput。 关于新生代190m内存其实还可以降低,但是再低些会导致gc过于频繁,吞吐量降低太多,这也是不太可取。
这是我的一些个人理解,希望大家能给些建议。
Spinner
pulsar_lxl的博客
pulsar_lxl 2014-11-05
我遇到的问题和楼主类似,我的基本配置是Xmx=3g, NewRatio=8, parNew + CMS,随着老年代使用内存不断增加,响应时间逐渐变长,系统吞吐也下降的厉害。
youlong699 写道
并且,随着old区可用内存减少、碎片增多(几次cmsgc之后),在old区分配空间耗时会变长。
这位仁兄的说法有什么理论依据没有,我只知道CMS使用空闲链表分配内存,空闲链表相对碰撞指针性能有下降,但是不知道随着old区内存使用量越来越多,空闲链表分配性能会越来越低吗?
Spinner
xxd82329的博客
xxd82329 2014-11-13
简单的说,做Minor GC的时候,JVM必须要扫描Old gen,因为Old gen里面的对象可能会有指向Young gen的引用。所以,当Old gen越来越大的时候,这种扫描所花的时间也就会越来越多了。
本人也同意第一位朋友的说法,Young gen设的太小了。一般来说,我倾向于把Young gen设到Heap的三分之一,甚至有时候会到二分之一。。。
希望对楼主有用。
Spinner
youlong699的博客
youlong699 2015-02-03
看到gc maillist里提到这个话题,想到这个帖子,顺道来贴一下再。
总结来说,就是perm gen 、code cache增大,由于需要扫描其对young gen的引用,导致扫描时间变长:
http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2015-January/002100.html
Spinner
rink1969的博客
rink1969 2015-02-13
最近也遇到一个类似现象的问题,补充一下,方便大家查找。
我那个问题最后发现是jvmti agent的问题。agent里面持续创建了很多jvmti对象和jni对象。这些也是strong root,要在YGC的时候扫描的。
但是经过一次CMS GC之后,这些都回收掉了,YGC就正常了。
Spinner
fh63045的博客
fh63045 2015-03-24
-server -Xloggc:./log/gcviewer.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -verbosegc -Xms2048M -Xmx2048M -Xmn190M -XX:+DisableExplicitGC -XX:+ScavengeBeforeFullGC -XX:ParallelGCThreads=8 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=31 -XX:+AggressiveOpts -XX:MaxGCPauseMillis=100 -XX:+HeapDumpOnOutOfMemoryError -XX:PermSize=128M -XX:MaxPermSize=256M
1. 新生代太小, 通用设置1-1.5倍FGC后老年代大小
2. 设置年龄太长了 使用 -XX:+PrintTenuringDistribution 判断具体年龄分布.
发表评论
-
使用jmap命令得到 jvm内存快照文件
2018-05-09 17:01 985jstat -gcutil 9744 9744是pid ... -
很详细的几篇 jconsole 指导的文章
2018-05-09 15:27 292https://blog.csdn.net/wuzhiping ... -
如何 调优jvm的一个实例
2018-01-05 15:32 391http://wetest.qq.com/lab/view/3 ... -
如何查内存泄漏的好文章
2017-10-17 16:48 435http://www.cnblogs.com/nsw2018/ ... -
深入jvm 讲得比较清楚
2017-10-17 16:36 724http://www.jianshu.com/p/759e02 ... -
JMX 例子 得到java mx对象
2017-02-09 16:03 515java 跑一个系统用这样的参数 vm argume ... -
JMX 例子
2017-02-09 15:13 373引用 JMX是什么 JMX是JAVA平台(JSE)标准的一部 ... -
java 内存测试
2017-02-03 19:29 288关于内存这块的 代码本地测试路径 D:\multithrea ... -
全例子诠释oom现象, 经典
2017-02-03 15:54 606http://www.cnblogs.com/dingying ... -
自己做例子看出来的一点名堂 对象在各个区区的位置
2017-02-03 14:13 327public class MethodArea ... -
各种OOM 错误的 例子 深入理解JVM—JVM内存模型
2017-02-02 22:36 511引用 http://www.cnblogs.com/ ... -
JVM分代、垃圾回收概念与一个JVM参数调优示例
2017-02-02 22:22 522引用 http://shensy.iteye.com/ ... -
从JVM堆中对象结构看编程内存优化
2017-02-02 22:25 328引用 http://shensy.iteye.com/blo ... -
jvm 调优方法
2017-02-02 19:52 370http://blog.csdn.net/gzh0222/ar ... -
JVM(java 虚拟机)内存设置
2016-09-30 17:25 401JVM(java 虚拟机)内存设置 一、设置JVM内存设置 ... -
深入理解Java内存模型(一)——基础
2016-09-30 17:25 286http://www.infoq.com/cn/article ... -
JVM内存管理及垃圾回收
2016-09-30 17:26 409http://blog.csdn.net/zhangerqin ... -
jvm 内存模型
2016-09-01 18:55 359本篇其实就是一个读书笔记,书是《深入理解JAVA虚拟机》,在网 ... -
图解JVM
2016-09-01 18:54 364http://ifeve.com/a-simple-examp ... -
console与jmx分析 , jvm信息
2016-05-30 17:07 460http://www.360doc.com/content/1 ...
相关推荐
从【部分内容】来看,文件详细地展开了JVM、Java集合、JAVA IO/NIO、JVM类加载机制、GC算法和垃圾收集器、多线程、微服务、大数据等知识点的讨论和说明,适合初学者和有一定基础的开发者复习和参考。
2. Minor GC和Full GC的触发时机 Java中的垃圾回收机制分为Minor GC和Full GC。Minor GC是对年轻代的垃圾回收,触发时机是当年轻代中对象的空间不足时。Full GC是对整个堆的垃圾回收,触发时机是当堆中的对象空间...
2. 复制算法:将堆内存分为两个等大的空间,一个是源空间(from space),另一个是目标空间(to space)。新对象在源空间分配,当源空间不足时,进行垃圾回收,把存活的对象复制到目标空间,并清空源空间。这种方法...
- `GC`(垃圾回收器):自动管理内存,释放不再使用的对象所占用的空间。 - `System.Web.UI.Page`:表示ASP.NET中的一个页面,是所有Web表单页面的基类。 以上知识点涵盖了C#编程语言及其相关技术的多个方面,对于...
**概念**:垃圾回收(GC)是指Java运行环境自动清理那些不再使用的对象,以释放内存空间的过程。 **工作原理**: - Java的垃圾回收机制会自动识别并回收不再被引用的对象。 - 垃圾回收器通常是由JVM自动调度的,...
这主要是为了解决Java 6向后兼容性问题,因为Java 6最高向下兼容到Java 1.2版本,而这两个版本之间的class信息存在较大差异。 - **关联选项**:`-XX:+UseSplitVerifier` ##### -XX:+HandlePromotionFailure - **...
他们的加载时机是随着类的加载而加载进入方法区,内存只中分配一块区域供所有类使用,可以节省空间。 九、Final、finally、finalize 三者区别 final 是一个修饰符:当 final 修饰一个变量的时候,变量变成一个常量...
- **垃圾回收机制**:Java自动管理内存,通过垃圾回收器定期回收不再使用的对象所占用的内存空间,从而避免了程序员手动管理内存的复杂性。 #### 五、在JAVA中,如何跳出当前的多重嵌套循环? 可以通过设置一个...
- 数据同步分为两种模式:广播模式和多播模式。 ### 七、分布式系统 1. **Dubbo支持的负载均衡策略** - **轮询**:按顺序选择服务提供者。 - **最少活跃调用数**:优先选择活跃调用数较少的服务提供者。 - **...