JVM难学?那是因为你没认真看完这篇文章
年轻代Parallel Scavenge收集器采用多个GC线程实现"复制"算法(包括扫描、复制)年老代Parallel Old收集器采用多个GC线程实现"标记-整理"算ParallelScavenge与Parallel Old都会暂停所有用户线程(即STW) 说明: 吞吐量:CPU运行代码时间/(CPU运行代码时间+GC时间)CMS主要注重STW的缩短(该时间越短,用户体验越好,所以主要用于处理很多的交互任务的情况)Parallel Scavenge/Parallel Old主要注重吞吐量(吞吐量越大,说明CPU利用率越高,所以主要用于处理很多的CPU计算任务而用户交互任务较少的情况) 参数设置: -XX:+UseParallelOldGC:使用该GC组合 -XX:GCTimeRatio:直接设置吞吐量大小,假设设为19,则允许的最大GC时间占总时间的1/(1+19),默认值为99,即1/(1+99) -XX:MaxGCPauseMillis:最大GC停顿时间,该参数并非越小越好 -XX:+UseAdaptiveSizePolicy:开启该参数,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或-XX:GCTimeRatio两个参数就好(当然-Xms也指定上与-Xmx相同就好) 注意: -XX:GCTimeRatio和-XX:MaxGCPauseMillis设置一个就好 不开启-XX:+UseAdaptiveSizePolicy,-Xmn/-XX:SurvivorRatio/-XX:PretenureSizeThreshold这些参数依旧可以配置,以resin服务器为例 <jvm-arg>-Xms2048m</jvm-arg> <jvm-arg>-Xmx2048m</jvm-arg> <jvm-arg>-Xmn512m</jvm-arg> <jvm-arg>-Xss1m</jvm-arg> <jvm-arg>-XX:PermSize=256M</jvm-arg> <jvm-arg>-XX:MaxPermSize=256M</jvm-arg> <jvm-arg>-XX:SurvivorRatio=8</jvm-arg> <jvm-arg>-XX:MaxTenuringThreshold=15</jvm-arg> <jvm-arg>-XX:+UseParallelOldGC</jvm-arg> <jvm-arg>-XX:GCTimeRatio=19</jvm-arg> <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCTimeStamps</jvm-arg> View Code 适用场合: 很多的CPU计算任务而用户交互任务较少的情况不想自己去过多的关注GC参数,想让虚拟机自己进行调优工作 八、调优方法 8.1 新对象预留新生代 由于fullGC(老年代)的成本远比minorGC(新生代和老年代)的成本大,所以给应用分配一个合理的新生代空间,尽量将对象分配到新生代减小fullGC的频率 8.2 大对象进入老年代 将大对象直接分配到老年代,保持新生代对象的结构的完整性,以提高GC效率, 以通过-XX:PretenureSizeThreshold设置进入老年代的阀值 8.3 稳定与震荡的堆大小 稳定的对大小是对垃圾回收有利的,方法将-Xms和-Xmx的大小一致 8.4 吞吐量优先 尽可能减少系统执行垃圾回收的总时间,故采用并行垃圾回收器 -XX:+UseParallelGC或使用-XX:+UseParallelOldGC 8.5 降低停顿 使用CMS回收器,同时减少fullGC的次数 九、获取gc信息的方法 9.1 -verbose:gc或者-XX:+PrintGC获取gc信息 9.2 -XX:+PrintGCDetails获取更加详细的gc信息 9.3 -XX:+PrintGCTimeStamps获取GC的频率和间隔 9.4 -XX:+PrintHeapAtGC获取堆的使用情况 9.5 -Xloggc:D:gc.log指定日志情况的保存路径 十、jvm调优实战-tomcat启动加速 在tomcat的bin/catalina.bat文件的开头添加相关的配置 六:监控工具 监控工具:一般问题定位,性能调优都会使用到。 (一)、jps Jps是参照Unix系统的取名规则命名的,而他的功能和ps的功能类似,可以列举正在运行的饿虚拟机进程并显示虚拟机执行的主类以及这些进程的唯一ID(LVMID,对应本机来说和PID相同),他的用法如下: Jps [option] [hostid] jps -q 只输出LVMID jps -m 输出JVM启动时传给主类的方法 jps -l 输出主类的全名,如果是Jar则输出jar的路径 jps -v 输出JVM的启动参数 (二)、jstat jstat主要用于监控虚拟机的各种运行状态信息,如类的装载、内存、垃圾回收、JIT编译器等,在没有GUI的服务器上,这款工具是首选的一款监控工具。其用法如下: jstat [option vmid [interval [s|ms] [vount] ] ] jstat 监控内容 线程好 刷新时间间隔 次数 jstat –gc 20445 1 20 :监视Java堆,包含eden、2个survivor区、old区和永久带区域的容量、已用空间、GC时间合计等信息 jstat –gcutil 20445 1 20:监视内容与-gc相同,但输出主要关注已使用空间占总空间的百分比 jstat –class 20445 1 20:监视类的装载、卸载数量以及类的装载总空间和耗费时间等 .......-gccapcity......:监视内容与-gc相同,但输出主要关注Java区域用到的最大和最小空间 .......-gccause........:与-gcutil输出信息相同,额外输出导致上次GC产生的原因 .......-gcnew..........:监控新生代的GC情况 .......-gcnewcapacity..:与-gcnew监控信息相同,输出主要关注使用到的最大和最小空间 .......-gcold..........:监控老生代的GC情况 .......-gcoldcapacity..:与-gcold监控信息相同,输出主要关注使用到的最大和最小空间 .......-gcpermcapacity.:输出永久带用到的最大和最小空间 .......-compiler.......:输出JIT编译器编译过的方法、耗时信息 .......-printcompilation:输出已经被JIT编译的方法 (三)、jinfo (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |