前提:java
某大型跨境电商业务发展很是快,线上机器扩容也很频繁,可是对于线上机器的运行状况,特别是jvm内存的状况,一直没有一个统一的标准来给到各个应用服务的owner。通过618大促以后,和运维的同窗讨论了下,但愿将线上服务器的jvm参数标准化,能够以一个统一的方式给到各个应用,提高线上服务器的稳定性,同时减小你们都去调整jvm参数的时间。
参考了以前在淘宝天猫工做的公司的经历:通过你们讨论,根据jdk的版本以及线上机器配置,肯定了一个推荐的默认jvm模版:程序员
最终推荐的jvm模版:
jdk版本 机器配置 建议jvm参数 备注
jdk1.7 6V8G -server -Xms4g -Xmx4g -Xmn2g -Xss768k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -Xloggc:{CATALINA_BASE}/logs/gc.log -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={CATALINA_BASE}/logs 前台
jdk1.7 8V8G -server -Xms4g -Xmx4g -Xmn2g -Xss768k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -Xloggc:{CATALINA_BASE}/logs/gc.log -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={CATALINA_BASE}/logs 前台
jdk1.7 4V8G -server -Xms4g -Xmx4g -Xmn2g -Xss768k -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+DisableExplicitGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=68 -verbose:gc -XX:+PrintGCDetails -Xloggc:{CATALINA_BASE}/logs/gc.log -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath={CATALINA_BASE}/logs 前台
jdk1.7 6V8G -server -Xms4g -Xmx4g -XX:MaxPermSize=512m \
-verbose:gc -XX:+PrintGCDetails -Xloggc{CATALINA_BASE}/logs/gc.log -XX:+PrintGCTimeStamps \ 后台
某互联网(bat)公司的推荐配置:
配置说明:算法
堆设置
o -Xms:初始堆大小
o -Xmx:最大堆大小
o -XX:NewSize=n:设置年轻代大小
o -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
o -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
o -XX:MaxPermSize=n:设置持久代大小sql
收集器设置
o -XX:+UseSerialGC:设置串行收集器
o -XX:+UseParallelGC:设置并行收集器
o -XX:+UseParalledlOldGC:设置并行年老代收集器
o -XX:+UseConcMarkSweepGC:设置并发收集器express
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
“安全
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)服务器
并发收集器设置
-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU状况。
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
(4)
参数解释:
-Xms3072m -Xmx3072m
针对JVM堆的设置,经过-Xms -Xmx限定其最小、最大值
-Xmn1024m设置年轻代大小为1024m
整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小(perm)。
-Xss768k 设置每一个线程的堆栈大小。JDK5.0之后每一个线程堆栈大小为1M,之前每一个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减少这个值能生成更多的线程。可是操做系统对一个进程内的线程数仍是有限制的,不能无限生成,经验值在3000~5000左右。
-XX:PermSize=512m -XX:MaxPermSize=512m
持久代通常固定大小为64m,因此增大年轻代后,将会减少年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4
-XX:+UseConcMarkSweepGC
CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器经过多线程并发进行垃圾回收,尽可能减小垃圾收集形成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器同样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。
-XX:+UseParNewGC对年轻代采用多线程并行回收,这样收得快;
-XX:+CMSClassUnloadingEnabled
若是你启用了CMSClassUnloadingEnabled ,垃圾回收会清理持久代,移除再也不使用的classes。这个参数只有在 UseConcMarkSweepGC 也启用的状况下才有用。
-XX:+DisableExplicitGC禁止System.gc(),省得程序员误调用gc方法影响性能;
-XX:+UseCMSInitiatingOccupancyOnly
标志来命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。而是,当该标志被开启时,JVM经过CMSInitiatingOccupancyFraction的值进行每一次CMS收集,而不只仅是第一次。然而,请记住大多数状况下,JVM比咱们本身能做出更好的垃圾收集决策。所以,只有当咱们充足的理由(好比测试)而且对应用程序产生的对象的生命周期有深入的认知时,才应该使用该标志。
-XX:CMSInitiatingOccupancyFraction=68
默认CMS是在tenured generation(年老代)占满68%的时候开始进行CMS收集,若是你的年老代增加不是那么快,而且但愿下降CMS次数的话,能够适当调高此值;
-XX:+UseParNewGC:对年轻代采用多线程并行回收,这样收得快;
-XX:HeapDumpPath
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/usr/aaa/dump/heap_trace.txt
上面的的参数打Heap Dump信息
“ -XX:+HeapDumpOnOutOfMemoryError
此参数能够控制OutOfMemoryError时打印堆的信息
你们可能注意到了,这里推荐采用cms方式进行垃圾回收;
CMS是一种以获取最短回收停顿时间为目标的收集器,能够有效减小服务器停顿的时间;
CMS的GC线程对CPU的占用率会比较高,但在多核的服务器上仍是展示了优越的特性,目前也被部署在国内的各大电商网站上。因此这里强烈推荐!
cms的概念:
CMS收集器也被称为短暂停顿并发收集器。它是对年老代进行垃圾收集的。CMS收集器经过多线程并发进行垃圾回收,尽可能减小垃圾收集形成的停顿。CMS收集器对年轻代进行垃圾回收使用的算法和Parallel收集器同样。这个垃圾收集器适用于不能忍受长时间停顿要求快速响应的应用。CMS采用了多种方式尽量下降GC的暂停时间,减小用户程序停顿。停顿时间下降的同时牺牲了CPU吞吐量 。这是在停顿时间和性能间作出的取舍,能够简单理解为”空间(性能)”换时间。
调整的节奏:
因为怕影响线上应用,因此调整的步骤分三步:
第一步:部分影响少许机器试点,对比未调整的机器,观察调整后的结果;
第二步:调整部分应用的参数,进行压测,观察高并发压测以后的效果;
第三步:调整部分核心应用的jvm参数,经过818大促来实际检验效果;
目前818大促已经结果。正好作一个个总结。
一:长期表现,
第一个变化:fgc的次数减小,减小了大概一倍以上;
mobile工程,调整前基本上一天1-2辆次,调整后基本上就是2-3天一次:
online(另一个工程):能够明显看到fgc的统计频率少了不少;
第二个变化:fgc的时间减小
原来一次fgc要将近500ms,如今只要100ms不到了。
也证实了cms最大的好处就是减小fgc的停顿时间。
二:压测及大促表现
fgc的时间基本上是大大缩短,yanggc的时间变长,次数变化不大;
数据来源:测试团队的压测总结多线程
xxxx-online4.server.org CMS | xxxx-online1.server.org CMS | xxxx-online34.server.org 默认垃圾收集器 | 说明 | |
---|---|---|---|---|
fullgc次数 | 1 | 1 | 1 | |
fullgc总时间 | 343 | 250 | 1219 | |
默认垃圾收集器/CMS fullgc 时间 | 3.55 | 4.88 | CMS fullgc**时间比默认垃圾收集器时间明显要少**。 | |
fullgc时间点 | 2:48:36 | 3:14:36 | 5:30:36 | |
fullgc时使用率CPU% | 40% | 10% | 16% | |
fullgc时的load Average | 1.19 | 0.49 | 1.21 | |
younggc总次数 | 1094 | 1098 | 1078 | |
younggc总时间 | 44093 | 44632 | 30387 | |
younggc平均时间 | 40.30 | 40.65 | 28.19 | |
younggc最大时间 | 1332 | 1268 | 928 | |
CMS/默认垃圾收集器(younggc总时间) | 1.45 | 1.47 | CMS younggc时间比默认垃圾收集器耗时 | |
CMS/默认垃圾收集器(younggc平均时间) | 1.43 | 1.44 | CMS younggc时间比默认垃圾收集器耗时 | |
CMS/默认垃圾收集器(younggc最大时间) | 1.44 | 1.37 | CMS younggc时间比默认垃圾收集器最差状况要差 |
三:关于哨兵上统计full gc的次数的解释,哨兵上
咱们能够安全的说:并发