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 jinfo的作用是实时查看虚拟机的各项参数信息jps –v可以查看虚拟机在启动时被显式指定的参数信息,但是如果你想知道默认的一些参数信息呢?除了去查询对应的资料以外,jinfo就显得很重要了。jinfo的用法如下: Jinfo [option] pid (四)、jmap map用于生成堆快照(heapdump)。当然我们有很多方法可以取到对应的dump信息,如我们通过JVM启动时加入启动参数 –XX:HeapDumpOnOutOfMemoryError参数,可以让JVM在出现内存溢出错误的时候自动生成dump文件,亦可以通过-XX:HeapDumpOnCtrlBreak参数,在运行时使用ctrl+break按键生成dump文件,当然我们也可以使用kill -3 pid的方式去恐吓JVM生成dump文件。Jmap的作用不仅仅是为了获取dump文件,还可以用于查询finalize执行队列、Java堆和永久带的详细信息,如空间使用率、垃圾回收器等。其运行格式如下: Jmap [option] vmip 监控堆栈信息主要用来定位问题的原因,生成堆栈快照 .......-dump......:生成对应的dump信息,用法为-dump:[live,]format=b,file={fileName} .......-finalizerinfo......:显示在F-Queue中等待的Finalizer方法的对象(只在linux下生效) .......-heap......:显示堆的详细信息、垃圾回收器信息、参数配置、分代详情等 .......-histo......:显示堆栈中的对象的统计信息,包含类、实例数量和合计容量 .......-permstat......:以ClassLoder为统计口径显示永久带的内存状态 .......-F......:虚拟机对-dump无响应时可使用这个选项强制生成dump快照 例子:jmap -dump:format=b,file=yhj.dump 20445 (五)、jstack (编辑:网站开发网_盐城站长网 ) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

