JVM 堆栈分析讲解
目录
一、通过windows版JDK自带的图形化工具
1.工具jvisualvm.exe
1.1.1启动脚本配置
1.1.2Jvisualvm.exe 工具配置
1.1.3在服务器上生产堆的dump文件
1.1.4执行GC操作
1.2工具jconsole.exe
1.2.1启动脚本配置 同1.1.1
1.2.2 启动jconsole.exe
1.2.3查看概览,内存,线程,类,jvm概要
1.2.4执行GC
1.3 线程dump分析工具-针对栈
1.3.1使用说明
1.4 Heap dump分析工具-针对堆
1.4.1 获取heap的转储快照dump文件
1.4.2导出到windows
1.4.3通过mat 工具分析heap
1.5 jvm常见命令用法
jmap -heap pid
jstack -l pid
二,如何排查JVM问题
一、通过windows版JDK自带的图形化工具
1.工具jvisualvm.exe
1.1.1启动脚本配置
tp-provider的start.sh:
pid=`ps -ef|grep task-platform-provider-*.jar|grep -v "grep"|awk '{print $2}'`
if [ "$pid" = "" ] ; then
echo "provider is starting"
nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9180 -Xmx2g -Xms2g -Xmn256m -XX:MetaspaceSize=128m '-Djava.rmi.server.hostname=10.106.1.83' '-Dcom.sun.management.jmxremote.port=8877' '-Dcom.sun.management.jmxremote.rmi.port=8877' '-Dcom.sun.management.jmxremote.ssl=false' '-Dcom.sun.management.jmxremote.authenticate=false' -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/dumpDir/providerDump.hprof -javaagent:"/home/skywalking-agent/skywalking-agent-provider/skywalking-agent.jar" -jar task-platform-provider-*.jar --spring.config.location=config/application.yml > /dev/null 2>&1 &
else
echo "provider has already been started->$pid"
fi
其中 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9180
为远程调试参数,简介如下:
jdwp:通知JVM使用(java debug wire protocol)来运行调试环境。
- session(transport):指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另外dt_shmem指用共享内存方式,其中dt_shmem只适用于窗口平台。
- server:指是否支持在服务器模式的虚拟机中。
- suspend:指明是否在调试客户端(本地)建立起来后,再执行JVM。
- address:用户自定义的,为debug端口号,不能被占用。
IDEA中远程调试需要增加启动配置,配置如下:
另外,
-Xmx2g -Xms2g -Xmn256m -XX:MetaspaceSize=128m
'-Djava.rmi.server.hostname=10.106.1.83' '-Dcom.sun.management.jmxremote.port=8877'
'-Dcom.sun.management.jmxremote.rmi.port=8877'
'-Dcom.sun.management.jmxremote.ssl=false'
'-Dcom.sun.management.jmxremote.authenticate=false'
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/dumpDir/providerDump.hprof
这些与JVM相关:
- -Xms 设置堆的最小空间大小。
- -Xmx 设置堆的最大空间大小。
- -Xmn:young generation(年轻代)的heap大小。一般为Xmx的 3、4 分之一。
- -XX:MetaspaceSize设置元数据区最小空间(元数据区:在JDK8中持久代(Permanent Generation)部分数据移到了元数据区(Metaspace),在JDK8中已经没有持久代。)。
- '-Djava.rmi.server.hostname=${ip_address}' 远程JVM运行的主机地址。
- '-Dcom.sun.management.jmxremote.port=${port}'
'-Dcom.sun.management.jmxremote.rmi.port=${port}'
解释如下:com.sun.management.jmxremote.port 指定端口后,除了在这个端口上会创建一个 RMI 连接器之外,还会额外创建另一个连接器,而这个额外创建的连接器的端口,就可以通过 com.sun.management.jmxremote.rmi.port 参数来指定。
当存在防火墙等网络访问限制时,可通过 com.sun.management.jmxremote.rmi.port 参数指定 RMI 连接器所使用的端口并进行开放。在这种场景下,必须设置此参数。
另外,com.sun.management.jmxremote.rmi.port 使用的端口,可以与 com.sun.management.jmxremote.port 指定的端口相同,这样仅开放一个端口就可以了。
- '-Dcom.sun.management.jmxremote.ssl=false'
默认值为true,这将启用客户端与JMX代理之间的安全套接字层(SSL)通信。将值设置为false以禁用SSL。
- '-Dcom.sun.management.jmxremote.authenticate=false'
默认值为true,启用使用用户名和密码的身份验证。将设置为false,表示不需要用户名和密码验证。
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/dumpDir/providerDump.hprof
在发生OOM(内存溢出)时,会在指定路径下生成堆dump文件
另外,
-javaagent:"/home/skywalking-agent/skywalking-agent-web/skywalking-agent.jar"
此参数表示skywalking相关,skywalking是分布式系统的应用程序性能监视工具,是非侵入式的。
最后,
--spring.config.location=config/application.yml
配置文件路径。
1.1.2Jvisualvm.exe 工具配置
工具路劲:C:\Program Files\Java\jdk1.8.0_91\bin
配置要查看服务对应的IP
添加连接JMX
查看概述,监听,线程,抽样器
1.1.3在服务器上生产堆的dump文件
1.1.4执行GC操作
1.2工具jconsole.exe
1.2.1启动脚本配置 同1.1.1
1.2.2 启动jconsole.exe
工具路径:C:\Program Files\Java\jdk1.8.0_91\bin
配置要查看的服务对应的IP
1.2.3查看概览,内存,线程,类,jvm概要
1.2.4执行GC
1.3 线程dump分析工具-针对栈
1.3.1使用说明
Step1. 导入栈dump 文件
命令: jps -l
查看 main 类或 Jar 的对应的进程
命令: jstack PID>> 路径/dump名称.tdump
生成栈tdump到指定路径
Step2. 分析栈dump 文件
从服务器获取 .tdump 到 Windows,通过jca工具分析
1.4 Heap dump分析工具-针对堆
1.4.1 获取heap的转储快照dump文件
方法一,命令生成
jmap - dump:format=b,file=路径/命名.phrof pid
jmap -dump:format=b,file=/home/dump2.phrof 1991
方法二,jvisualVM工具生成
1.4.2导出到windows
1.4.3通过mat 工具分析heap
Step1:导入heapdump.phrof 到 mat
Step2:分析heapdump.phrof
1.5 jvm常见命令用法
①
jps [options] [hostid] (hostid 为 ip 或域名地址)
jps 是用于查看有权访问的 hotspot 虚拟机的进程,当未指定 hostid 时,默认查看本机 jvm 进程。
常用命令:jps –l
输出进程号和对应的 main 类或 jar 的全限名,如下图所示。
jmap -heap pid
用于打印指定 Java 进程的堆内存细节。
jmap -heap pid > 目录/jmap_heap.dump
输出进程的堆内存信息到指定目录下的文件jmap_heap.dump中,这样可以把jmap_heap.dump拿到windows上看
- MaxHeapFreeRatio:最大空闲堆内存比例
最大空闲对内存比例,GC 后如果发现空闲堆内存大于整个预估堆内存的 N%(百分比),JVM 则会收缩堆内存,但不能小于-Xms 指定的最小堆的限制。
- MinHeapFreeRatio: 最小空闲堆内存比例
GC 后如果发现空闲堆内存小于整个预估堆内存的 N%(百分比), 则 JVM 会增大堆内存,但不能超过-Xmx 指定的最大堆内存限制。
- MaxHeapSize: 即-Xmx, 堆内存大小的上限
- InitialHeapSize: 即-Xms, 堆内存大小的初始值
- NewSize:新生代预估堆内存占用的默认值
- MaxNewSize: 新生代占整个堆内存的最大值
- OldSize: 老年代的默认大小,
- NewRatio:
老年代对比新生代的空间大小, 比如 2 代表老年代空间是新生代的两倍大小.
- SurvivorRatio:
Eden/Survivor 的值. 例如 8 表示 Survivor:Eden=1:8, 因为 survivor 区
有 2 个, 所以 Eden 的占比为 8/10.
- MetaspaceSize:
分配给类元数据空间的初始大小(Oracle 逻辑存储上的初始高水位, the initial high-water-mark ). 此值为估计值. MetaspaceSize 设置得过大会延长垃圾回收时间. 垃圾回收过后, 引起下一次垃圾回收的类元数据空间的大小可能会变大
- MaxMetaspaceSize:
是分配给类元数据空间的最大值, 超过此值就会触发 Full GC. 此值仅受限于系统内存的大小, JVM 会动态地改变此值
- CompressedClassSpaceSize:
类指针压缩空间大小, 默认为 1G.
- G1HeapRegionSize:
G1 区块的大小, 取值为 1M 至 32M. 其取值是要根据最小Heap 大小划分出 2048
个区块.
说明:jmap 在系统调优时通常会结合 jhat 来分析 jmap 生成的 dump 文件。
内存泄露 : 对象不使用了还占用着内存,是导致内存溢出的一个原因。内存泄露不等于内存溢出。
③
jstack -l pid
用于打印指定 Java 进程当前时刻的线程快照。-l表示除堆栈外,显示关于锁的附加信息。
jstack -l pid > 目录/jstack.tdump
输出进程的线程情况到目录下的jstack. tdump文件中。
二,如何排查JVM问题
基础准备:
jps -l 查看各个应用程序或者jar包的进程
Jps -v 查看各个应用程序或jar 包的 jvm 参数配置
以上两步截图备用
- 可以使⽤jmap或者 jstat命令来查看jvm堆中各个区域的参数配置和使用情况 ,如果有使用率过高,占满,可以先考虑参数调优。当然也可以用jvm自带的jvisualVM,Jconsole来进行可视化的分析,主要也是参数配置可使用情况,附带一些CPU,线程运行等信息。
- 可以通过jstack生栈的dump文件,来查看栈中的运⾏情况 1>jstack PID>> 路径/dump名称.tdump 2> .tdump文件copy到windows上,通过jca 工具来分析,栈信息,主要是死锁,是否要线程挂起,是否有阻塞等。
- 可以通过jmap 生产对的dump文件,你用cat 工具分析堆中具体出问题的地方,找到对应服务中哪一行代码具体处理
jmap - dump:format=b,file=路径/命名.phrof pid
jmap -dump:format=b,file=/home/dump2.phrof 1991
- 一般在服务的启动文件中会配置内存溢出时堆的dump文件保存位置,找到这个文件也可以按3的方法直接分析
总之,调优不是⼀蹴⽽就的,需要分析、推理、实践、总结、再分析,最终定位到具体的问题
JVM 堆栈分析讲解相关推荐
- jvm线程分析命令_JVM:如何分析线程转储
jvm线程分析命令 本文将教您如何分析JVM线程转储,并查明问题的根本原因. 以我的观点,线程转储分析是掌握Java EE生产支持的任何个人最重要的技能. 您可以从线程转储快照中获取的信息量通常远远超 ...
- jstack 工具 查看JVM堆栈信息
1|0介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&q ...
- 全网最硬核 JVM TLAB 分析(额外加菜) 8. 通过 JFR 监控 TLAB
今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...
- JVM虚拟机学习 - JVM类加载,JVM内存模型,JVM性能分析工具
JVM虚拟机 二 JVM类加载 类的生命周期 加载: 加载class文件到二进制字节流,然后再将二进制字节流转化为方法区的运行时数据结构,生成一个对应的Class对象作为类各种数据的访问入口. 链 ...
- java堆栈分析工具_JVM内存分析工具使用
Java 内存堆栈分析.我们在分析现网问题时候,经常会遇到一些问题从日志上无法分析的疑难问题.在我们举足无措的时候,我们可以分析一些JVM内存,来看看问题出在哪里了. 我们经常用到的一工具: 分析栈内 ...
- linux分析jstack,jstack命令以及线程转储堆栈分析
一.命令介绍 jstack是jdk自带的jvm分析工具,用于打印指定 java进程,core文件 或者远程 调试服务 的java线程栈信息,从而分析java程序性能不佳或者崩溃的问题.另外该命令是实验 ...
- JVM指令分析实例四(数组、switch)
本篇为<JVM指令分析实例>的第四篇,相关实例均使用Oracle JDK 1.8编译,并使用javap生成字节码指令清单. 前几篇传送门: JVM指令分析实例一(常量.局部变量.for循环 ...
- jvm crash分析工具
为什么80%的码农都做不了架构师?>>> 介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log.里面记录了jvm当时的运行状态以及错 ...
- JVM 逃逸分析 (史上最全)
对于JVM"逃逸分析" 特性,也是近年来大厂面试.高薪面试的常见面试题. 和逃逸分析有关的常见面试题: Java中的对象一定是在堆上分配的吗? 注:本文以 PDF 持续更新,最新尼 ...
最新文章
- js如何实现扫描身份证识别_人脸识别是如何实现的
- javaList容器中容易忽略的知识点
- cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp” 和 cl: 命令行 error D8021 :无效的数值参数“/Wno-unused-function”
- centos安装g++
- ITK:预定义操作以对应两个图像中的像素
- Ng第十二课:支持向量机(Support Vector Machines)(一)
- [转载]当代中国建筑设计百家名院名单
- 学习设计模式 - 六大基本原则之接口隔离原则
- Direct3D 开发之旅 3D 游戏基本概念的介绍2
- Linux下c开发 之 线程通信与pthread_cond_wait()的使用
- java swing简介
- 【操作系统/OS笔记19】数据块缓存
- 通过第三方平台超级鹰进行登录页面验证码识别
- 关闭windows电脑 ctrl +alt +方向键旋转屏幕快捷键
- 关于对象中的this指向和修改this指向问题。
- 0x00F749F6 处(位于 基于多态实现职工管理系统.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突。
- 如何将微商相册上的所有图片和小视频快速下载和保存
- linux安装glib,glib源码安装使用方法
- 怎么恢复删除的微信聊天记录?手残党终于有救了
- 有了这几个webp转换工具,快速完成图片转换工作