当处事产生GC问题时,一般会利用jmap东西举办阐明,jmap东西很强大,所以有须要相识它的方方面面。
jmap可以做什么?
1、jmap -histo[:live] <pid>
通过histo选项,打印当前java堆中各个工具的数量、巨细。
假如添加了live,只会打印活泼的工具。
2、jmap -dump:[live,]format=b,file=<filename> <pid>
通过-dump选项,把java堆中的工具dump到当地文件,然后利用MAT举办阐明。
假如添加了live,昆山软件开发,昆山软件开发,只会dump活泼的工具。
3、jmap -heap <pid>
通过-heap选项,打印java堆的设置环境和利用环境,尚有利用的GC算法。
4、jmap -finalizerinfo <pid>
通过-finalizerinfo选项,打印那些正在期待执行finalize要领的工具。
5、jmap -permstat <pid>
通过-permstat选项,打印java堆永久代的信息,包罗class loader相关的信息,和interned Strings的信息。
jmap实现道理
通过jmap和jvm之间举办通信,有两种实现方法:attach 和 SA。
attach
attach方法,简朴来说就是客户端和处事端之间的通信,客户端发送请求,主要逻辑在处事端执行,jmap相当于客户端,JVM相当于处事端。
在JVM中,有一个叫”Attach Listener”的线程,专门认真监听attach的请求,并执行对应的操纵。
好比此刻执行”jmap -histo:live 5409″,一步一步的实现如下:
attach要领成立了jmap历程和JVM之间的socket毗连,成立进程可以查察笨神的文章JVM Attach机制实现,后续基于该毗连举办通信。
因为呼吁行中添加了[:live]选项,这里的live参数是true。
再看看heapHisto要领
executeCommand要领基于之前的socket毗连向JVM发送了一条”inspectheap”呼吁,虽然了,尚有参数。
虚拟机的”Attach Listener”线程当发明有新的呼吁时,就拿出来处理惩罚它。
呼吁和详细的函数对应干系如下:
和”inspectheap”对应的是heap_inspection要领,实现如下:
live_objects_only的值取决于请求中是否有”-live”,再jmap中,取决于是否有”:live”,所以不管是不是添加了”:live”,城市有STW进程,时间是非罢了。
在VM_GC_HeapInspection的doit要领中
_full_gc的值就是live_objects_only,假如为true,大概会执行一次full gc,清空非活泼的工具,可是大概会因为GC locker,导致跳过本次的GC。
“jmap -dump”实现的道理和”jmap -histo”雷同,都是通过attach的方法实现,
attach API的实现方法是:
SA
如果执行”jmap -heap 5409″,就不会利用attach方法实现了。