Java虚拟机性能监控与调优
1 基于JDK命令行工具的监控
1.1 JVM的参数类型
1.1.1 标准参数
在JVM的各个版本基本上保持不变,很稳定的。
-help
-server -client
-version -showversion
-cp -classpath
1.1.2 X参数
非标准化参数
-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
1.1.3 XX参数
非标准化参数
相对不稳定
主要用于JVM调优和Debug
Boolean类型
格式:-XX:[+-]<name>表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
-XX:GCTimeRatio=19
-Xmx -Xms
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
| 命令 | 作用 |
| ps -ef|grep java | 查看java的进程相关信息,以及启动的配置信息 |
| jinfo -flag MaxHeapSize pid | 查看该pid的JVM最大的堆内存大小 |
| jinfo -flag ThreadStackSize pid | 查看该pid的JVM每个线程的栈大小 |
1.2 运行时JVM参数查看
-XX:+PrintFlagsInitial
初始值
-XX:+PrintFlagsFinal
最终值

= 表示默认值
:= 被用户或者JVM修改后的值
-XX:+UnlockExperimentalVMOptions 解锁实验参数
-XX:+UnlockDiagnosticVMOptions 解锁诊断参数
-XX:+PrintCommandLineFlags 打印命令行参数
jps
类似与Linux服务器上的ps功能。
相关命令:
jps -help 查看帮助
jps -l 查看正在运行的列表
jps命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html
jinfo命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD
jstack命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF
jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
jinfo
查看正在运行的JVM里面的参数值。
相关命令:jinfo -flag MaxHeapSize pid 查看正在运行的进程为PID的JVM的最大堆内存
jinfo -flags pid 查看正在运行的进程为PID的JVM的已经被修改过的JVM的参数值
查看最大内存

查看垃圾回收器

1.3 jstat查看虚拟机统计信息
类装载
jstat命令详细参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
参考命令:jstat -class pid 查看类加载的信息
jstat -class pid 1000 10 每隔1000ms打印一次类加载信息,打印10次。

垃圾收集
参考命令:jstat -gc pid 查看进程号为pid的JVM的垃圾收集信息,具体响应详细参数jstat命令详细参考
jstat -gc pid 1000 10 每隔1000ms打印一次进程号为pid的JVM的垃圾收集信息,打印10次。

JIT编译
参考指令:jstat -compiler pid 查看进程号为pid的JVM的即时编译信息。

2 Jmap+MAT实战内存溢出

2.1 模拟对内存溢出的代码参考:
2.2 如何导出内存映像文件
2.2.1 内存溢出自动导出
程序启动的时候,设置以下参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
2.2.2 使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof pid 导出进程号为pid的JVM的dump文件
jmap -heap pid 打印进程号为pid的JVM的堆信息
jmap命令
option: -heap, -clstats, -dump:<dump-options>, -F
更多详细命令参考:jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
2.3 MAT分析内存溢出
MAT工具下载地址:http://www.eclipse.org/mat/downloads.php
将步骤2.2导出的dump文件,用MAT工具打开分析。
2.4 JAVA线程状态
NEW WAITING RUNNABLE TIMED_WAITING BLOCKED TERMINATED
更多详细信息参考:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html
3 实战死循环导致CPU飙高
查找死循环导致CPU飙高问题的常用指令:
top -p pid -H #打印该进程的所有线程,查看占用CPU资源超高的线程ID,该线程ID为10进制,要用下面的命令将其转换为16进制,然后在stack信息中查找详细信息
printf "%x" 十进制的线程id #将十进制的线程id转换为16进制
jstack pid #打印程序的stack信息,从中找出CPU占用超过的线程ID的stack信息
也可以参考:https://www.cnblogs.com/alsodzy/p/10188691.html,来排查CPU飙高的问题。
Java虚拟机性能监控与调优的更多相关文章
- Java虚拟机性能监控与调优实战
From: https://c.m.163.com/news/a/D7B0C6Q40511PFUO.html?spss=newsapp&fromhistory=1 Java虚拟机性能监控与调 ...
- Java项目性能监控和调优工具-Javamelody的学习总结
1.简介: JavaMelody能够在运行环境监测Java或Java EE应用程序服务器.并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http ...
- JAVA性能监控与调优参考文档链接
JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...
- Java生产环境下性能监控与调优详解
1:JVM字节码指令与 javapjavap <options> <classes>cd monitor_tuning/target/classes/org/alanhou/m ...
- Java生产环境下性能监控与调优详解视频教程 百度云 网盘
集数合计:9章Java视频教程详情描述:A0193<Java生产环境下性能监控与调优详解视频教程>软件开发只是第一步,上线后的性能监控与调优才是更为重要的一步本课程将为你讲解如何在生产环境 ...
- <JVM下篇:性能监控与调优篇>补充:使用OQL语言查询对象信息
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- kafka consumer demo
kafka消费者demo pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmln ...
- ubuntu下修改nginx的进程数
1. 进入nginx配置文件:vim /etc/nginx/nginx.conf2. 将events下的worker_processes 修改为 你希望的数字,保存文件并退出3. 重启nginx: s ...
- dubbo支持协议及具体对比
对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...
- oraclejdbc
https://segmentfault.com/q/1010000004952621/a-1020000004955600
- Pl/sql学习笔记2
-- declare type vsal_table is table of emp.sal%type; a vsal_table; begin --必须得初始化 并且有数量上的区分 从一开的 a ...
- 封装,策略,Asp换脸
封装.策略 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...
- Scanner的例子
package com.firstDay.one; import java.util.Scanner; public class Information { /** * @param args */ ...
- 利用CNN进行多分类的文档分类
# coding: utf-8 import tensorflow as tf class TCNNConfig(object): """CNN配置参数"&qu ...
- Mysql中实现递归查询
1.常规表字段 id,pid,lev,name 2.sql语句 DELIMITER // DROP PROCEDURE IF EXISTS Pro_GetColumnOrg//CREATE PROCE ...
- iOS- Swift:指触即开,如何集成Touch ID指纹识别功能
1.前言 随着移动支付时代的到来,Touch ID 指纹验证迅速被支付宝,微信钱包普及,相信各位朋友使用后也大呼方便.之前写了篇关于iOS9的3D Touch的集成使用,有朋友在我博客下提到,让我写一 ...