前言
再筆試以及日常的開發工作中,我們多少會用到一些問題,而解決問題的根本就是尋找問題的根源,在這裏我將日常使用的性能監測工具以及虛擬機用到的調優參數羅列出來,希望對大家有所幫助。
性能監控常用工具
- 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