jcmd:向JVM發送診斷的命令,jvm未必會所有響應,有些須要在jvm開啓相應功能才能響應。我的平時用的不是不少。html
SampleA: 添加 jcmd pid VM.native_memory detail 查看jvm內存分配狀況(堆內內存、Code區域或者使用unsafe.allocateMemory和DirectByteBuffer申請的堆外內存),不包括底層c語言分配的內存spring
Reserved的內存是指在虛擬內存地址中申請的內存頁,並無關聯實際內存,因此不會對應用的內存佔用產生什麼實際的影響(在應用看來,它的內存區變的連續了)。因此這個rserve的內存大小通常和top的virt內存塊對應。commit的內存是已經關聯了物理內存(有的是物理內存,有的是磁盤的文件(swamp內存)),它和top的實際佔用內存相關。windows
Jcmd看到的commit內存總和是jvm層面實際分配的內存大小。 Pmap的RSS的總內存是應用在操做系統層面佔用的總內存,應該和top裏顯示的是一致的(他們是commit的內存 除去 page out的內存)。 api
https://docs.microsoft.com/zh-cn/windows/desktop/api/memoryapi/nf-memoryapi-virtualallocjvm
https://stackoverflow.com/questions/2440434/whats-the-difference-between-reserved-and-committed-memoryspring-boot
https://zhanjindong.com/2016/03/02/jvm-memory-tunning-notes工具
jmap:提供dump,和統計JVM內存使用的必定粒度的統計信息(主要是堆內內存),更細粒度的信息須要使用專門的分析工具。性能
jinfo:查看或者動態設置單個或多個的JVM標誌,可是jvm不必定會響應。spa
jstack:線程棧信息操作系統
Jstat:查看JVM的一些指標:比較經常使用的有gc回收的統計信息,還能夠看classLoader,compiler,metaSpace等等的一些信息
性能分析工具:1. 採樣分析類型 2. 探查分析類型
1. 採樣分析類:按照必定的頻率來進行統計。優勢:對應用的性能損耗小。 缺點:統計信息可能不是很精確,可能會漏掉一些信息。
2. 探查分析類:會對類的字節碼進行增強,因此帶來的性能損耗會比較大。優勢是統計信息比較精確。
比較好用的採樣類分析器:JFR+JMC
比較好用的dump分析器:MAT
gc日誌也很重要,能夠查看更細節的gc活動,不過有些細節的日誌打印須要開啓相關的jvm參數:
-XX:+PrintGCDetails
-XX:+PrintAdaptiveSizePolicy
pmap -x pid 從系統層面來查看應用的內存分配狀況,包括c語言層面分配的native內存。
內存診斷經典例子:
https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak.html