前言
再笔试以及日常的开发工作中,我们多少会用到一些问题,而解决问题的根本就是寻找问题的根源,在这里我将日常使用的性能监测工具以及虚拟机用到的调优参数罗列出来,希望对大家有所帮助。
性能监控常用工具
- javap:将class文件返汇编为我们可读格式的工具,默认打印所有非私有的字段和方法,-p 私有的也打印 - v打印所有信息,如果只是查看字节码-c,Code ToolsASM
- VisualVM
- JConsole
- JProfiler
- YourKit
JVM常用参数
- Xss:设置线程vm stack的大小,如果超过vm规定报stackoverflowerror,栈帧越大,深度越小,深度指栈帧的个数,例如 java -Xss5m
- Xms & Xmx
- Xmx:-Xmx用来设置应用程序(不是JVM)能够使用的最大内存数
- Xms:-Xms用来设置程序初始化的时候内存栈的大小
- 直接内存:堆外内存,引用 放入堆中(可以避免java堆和native堆的数据复制),参数MaxDirectMemorySize 指定
- TLAB(本地线程分配缓存)
- Thread local Allocation buffer,线程在堆上的对象内存分配采用不同的线程拥有单独的小块内存,需要进行TLAB增加时,同步锁定,是否使用TLAB由参数-XX:+/-UseTLAB设定
- 最大方法区容量:MaxPermSize
- 配置是否对方法区中的类信息进行回收:-Xnoclassgc
- 垃圾收集器中参数
- Serial & ParNew:-XX:SurvivorRatio -XX:PretenureSizeThreshold -XX:HandlePromotionFailure
- 使用CMS收集器:-XX:+UseConcMarkSweepGC作为老年代,则新生代只能选择Serial 或者parnew
- ParNew是Serial的多线程版,一般线程数和cpu核数相同,通过-XX:ParallelGCThreads限制
- SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认为8
- PretenureSizeThreshold:直接进入老年代的大小,对象大于这个值,直接进入老年代(避免发生大量的内存复制)
- UseAdaptiveSizePolicy:动态调整Java堆中各个区域的大小,以及进入老年代的年龄
- -XX:+PrintGCDetails:发生收集行为时打印收集日志
- -XX:MaxTenuringThreshold:设置对象进入老年代的年龄
- HandlePromotionFailure,设置空间担保true or false