湖北移动官网网站建设,网络营销策划书800字,天眼查官网登录入口,淘宝运营可以自学吗jmap可以做什么#xff1f;
1、jmap -histo[:live]
通过histo选项#xff0c;打印当前java堆中各个对象的数量、大小。
如果添加了live#xff0c;只会打印活跃的对象。
2、jmap -dump:[live,]formatb,file
通过-dump选项#xff0c;把java堆中的对象dump到本地文件
1、jmap -histo[:live]
通过histo选项打印当前java堆中各个对象的数量、大小。
如果添加了live只会打印活跃的对象。
2、jmap -dump:[live,]formatb,file
通过-dump选项把java堆中的对象dump到本地文件然后使用MAT进行分析。
如果添加了live只会dump活跃的对象。
3、jmap -heap
通过-heap选项打印java堆的配置情况和使用情况还有使用的GC算法。
4、jmap -finalizerinfo
通过-finalizerinfo选项打印那些正在等待执行finalize方法的对象。
5、jmap -permstat
通过-permstat选项打印java堆永久代的信息包括class loader相关的信息,和interned Strings的信息。
jmap实现原理
通过jmap和jvm之间进行通信有两种实现方式attach 和 SA。
attach
attach方式简单来说就是客户端和服务端之间的通信客户端发送请求主要逻辑在服务端执行jmap相当于客户端JVM相当于服务端。
在JVM中有一个叫Attach Listener的线程专门负责监听attach的请求并执行对应的操作。
比如现在执行jmap -histo:live 5409一步一步的实现如下
1、在Jmap.java类的main函数中对参数进行解析。
2、解析出来参数中有“-histo:live”则执行histo方法 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的实现方式是
1、客户端连接到目标JVM向其发出一个类似“inspectheap”命令
2、目标JVM接收到命令执行JVM内相关函数将收集到的结果以文本形式返回
3、客户端接收到返回的文本并将其显示出来
SA
假如执行jmap -heap 5409就不会使用attach方式实现了。
在参数解析中如果参数是-heap|-heap:formatb|-permstat|-finalizerinfo中的一种或者添加了-F比如jmap -histo -F 5409则使用SA的方式。 SA方式和attach方式不同的是相关的主要逻辑都在SA中实现从JVM中获取数据即可。
可以大概看下jmap -heap的实现对应的实现类是HeapSummary内部通过BugSpotAgent工具类attach到目标VM更具体的底层细节可以参考HotSpot Serviceability Agent 实现浅析
执行jmap -heap有些时候可能会导致进程变T一般是有一个线程在等信号量这时会block住其它所有线程可以执行kill -CONT 进行恢复不过还是强烈建议别执行这个命令。