首页 > 其他 > 详细

jvm调优-jmap工具jinfo工具(在docker容器中使用)

时间:2021-05-26 21:17:10      阅读:33      评论:0      收藏:0      [点我收藏+]

 

Docker 自1.10版本开始加入的安全特性。类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是Docker自1.10在默认的seccomp配置文件中禁用了ptrace
解决方案 
如果使用docker-compose启动容器,如下加入 cap_add即可
[root@localhost etl]# cat docker-compose.yml 
version: 2
services:
 powerEtl:
  image: power-etl:1.0
  network_mode: "host"
  volumes:
         - /root/etl/:/root/etl/
  cap_add:
         - SYS_PTRACE

打印Java堆概要信息,包括使用的GC算法、堆配置参数和各代中堆内存使用情况

1:jmap -heap pid(下面例子中的pid是1)

技术分享图片
[root@localhost /]# docker exec -it 2cf384 /bin/sh
/ # jps
1 jar
102 Jps
/ # jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio         = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio         = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize              = 2051014656 (1956.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize                  = 42991616 (41.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize               = 683671552 (652.0MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize                  = 87031808 (83.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio                 = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage: //堆内存使用情况
PS Young Generation
Eden Space:
   capacity = 325058560 (310.0MB) //Eden区总容量
   used     = 241188112 (230.01490783691406MB) //Eden区已使用
   free     = 83870448 (79.98509216308594MB) //Eden区剩余容量
   74.19835736674648% used //Eden区使用比率
From Space: //其中一个Survivor区的内存分布
   capacity = 9437184 (9.0MB)
   used     = 7042944 (6.7166748046875MB)
   free     = 2394240 (2.2833251953125MB)
   74.62972005208333% used
To Space: //另一个Survivor区的内存分布
   capacity = 9961472 (9.5MB)
   used     = 0 (0.0MB)
   free     = 9961472 (9.5MB)
   0.0% used
PS Old Generation //当前的Old区内存分布
   capacity = 62390272 (59.5MB)
   used     = 14477120 (13.80645751953125MB)
   free     = 47913152 (45.69354248046875MB)
   23.20413028492647% used

21711 interned Strings occupying 2094576 bytes.
View Code
 2:查看jvm(堆栈)配置
jmap -heap 1(1为pid) 方式一
jinfo -flags 1(1为pid) 方式二
技术分享图片
/usr/local/data # jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08

using thread-local object allocation.
Parallel GC with 4 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2051014656 (1956.0MB)
   NewSize                  = 42991616 (41.0MB)
   MaxNewSize               = 683671552 (652.0MB)
   OldSize                  = 87031808 (83.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 656408576 (626.0MB)
   used     = 159059424 (151.69088745117188MB)
   free     = 497349152 (474.3091125488281MB)
   24.231771158334166% used
From Space:
   capacity = 13631488 (13.0MB)
   used     = 0 (0.0MB)
   free     = 13631488 (13.0MB)
   0.0% used
To Space:
   capacity = 13631488 (13.0MB)
   used     = 0 (0.0MB)
   free     = 13631488 (13.0MB)
   0.0% used
PS Old Generation
   capacity = 119013376 (113.5MB)
   used     = 26036112 (24.829971313476562MB)
   free     = 92977264 (88.67002868652344MB)
   21.876626707908866% used

22674 interned Strings occupying 2488024 bytes.
/usr/local/data # jinfo -flags 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
Non-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=130023424 -XX:MaxHeapSize=2051014656 -XX:MaxNewSize=683671552 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=42991616 -XX:OldSize=87031808 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line:  -Djava.security.egd=fele:/dev/./urandom
View Code

3:jmap分析堆,定位内存溢出的具体类

jmap -histo:live 1  (1:pid) 

技术分享图片

 

 

 上图可以看出 导致内存溢出的是Test类

将定位详情输出到指定文件中查看
/usr/local/data # jmap -histo:live 1 > 1.txt (1.txt为要输出的文件内容)
/usr/local/data # ls
1.txt
/usr/local/data # 

4:打印等待回收的对象

/usr/local/data # jmap -finalizerinfo 1 (1为pid)
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
Number of objects pending for finalization: 0 
//说明当前F-QUEUE队列中并没有等待Fializer线程执行finalizer方法的对象

 

jvm调优-jmap工具jinfo工具(在docker容器中使用)

原文:https://www.cnblogs.com/s6-b/p/14814531.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!