JVM虚拟机-0五、JVM调优详解java
-versiongit
-helpgithub
-serverweb
-cpshell
非标准参数,也就是在JDK各个版本中可能会变更tomcat
-Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM本身来决定
使用得最多的参数类型session
非标准化参数,相对不稳定,主要用于JVM调优和Debugeclipse
a.Boolean类型 格式:-XX:[+-]<name> +或-表示启用或者禁用name属性 好比:-XX:+UseConcMarkSweepGC 表示启用CMS类型的垃圾回收器 -XX:+UseG1GC 表示启用G1类型的垃圾回收器 b.非Boolean类型 格式:-XX<name>=<value>表示name属性的值是value 好比:-XX:MaxGCPauseMillis=500
-Xms1000等价于-XX:InitialHeapSize=1000 -Xmx1000等价于-XX:MaxHeapSize=1000 -Xss100等价于-XX:ThreadStackSize=100
因此这块也至关因而-XX类型的参数curl
java -XX:+PrintFlagsFinal -version > flags.txt
jvm
值得注意的是"="表示默认值,":="表示被用户或JVM修改后的值
通常要设置参数,能够先查看一下当前参数是什么,而后进行修改
1Byte(字节)=8bit(位) 1KB=1024Byte(字节) 1MB=1024KB 1GB=1024MB 1TB=1024GB
(1)设置堆内存大小和参数打印 -Xmx100M -Xms100M -XX:+PrintFlagsFinal (2)查询+PrintFlagsFinal的值 :=true (3)查询堆内存大小MaxHeapSize := 104857600 (4)换算 104857600(Byte)/1024=102400(KB) 102400(KB)/1024=100(MB) (5)结论 104857600是字节单位
查看java进程
The jps command lists the instrumented Java HotSpot VMs on the target system.The command is limited to reporting information on JVMs for which it has theaccess permissions.
(1) 实时查看和调整JVM配置参数
The jinfo command prints Java configuration information for a specified Javaprocess or core file or a remote debug server. The configuration informationincludes Java system properties and Java Virtual Machine (JVM) command-lineflags.
(2) 查看
jinfo -flag name PID 查看某个java进程的name属性的值
jinfo -flag MaxHeapSize PID jinfo -flag UseG1GC PID
(3) 修改
参数只有被标记为manageable的flags能够被实时修改
jinfo -flag [+|-] PID
jinfo -flag = PID
(4) 查看曾经赋过值的一些参数
jinfo -flags PID
(1) 查看虚拟机性能统计信息
The jstat command displays performance statistics for an instrumented JavaHotSpot VM. The target JVM is identified by its virtual machine identifier, orvmid option.
(2) 查看类装载信息
jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10次
(3) 查看垃圾收集信息
jstat -gc PID 1000 10
(1) 查看现场堆栈信息
The jstack command prints Java stack traces of Java threads for a specified Javaprocess, core file, or remote debug server.
(2)用法
jstack PID
(3) 排查死锁案列
DeadLockDemo
//运行主类 public class DeadLockDemo { public static void main(String[] args) { DeadLock d1=new DeadLock(true); DeadLock d2=new DeadLock(false); Thread t1=new Thread(d1); Thread t2=new Thread(d2); t1.start(); t2.start(); } } //定义锁对象 class MyLock{ public static Object obj1=new Object(); public static Object obj2=new Object(); } //死锁代码 class DeadLock implements Runnable{ private boolean flag; DeadLock(boolean flag){ this.flag=flag; } public void run() { if(flag) { while(true) { synchronized(MyLock.obj1) { System.out.println(Thread.currentThread().getName()+"----if 得到obj1锁"); synchronized(MyLock.obj2) { System.out.println(Thread.currentThread().getName()+"--- -if得到obj2锁"); } } 咕泡学院 只为更好的你 运行结果 jstack分析 把打印信息拉到最后能够发现 } } else { while(true){ synchronized(MyLock.obj2) { System.out.println(Thread.currentThread().getName()+"----不然 得到obj2锁"); synchronized(MyLock.obj1) { System.out.println(Thread.currentThread().getName()+"--- -不然得到obj1锁"); } } } } } }
把打印信息拉到最后能够发现
- 生成堆快照
The jmap command prints shared object memory maps or heap memory details of a specified process, core file, or remote debug server.
2 打印出堆内存相关信息
-XX:+PrintFlagsFinal -Xms300M -Xmx300M jmap -heap PID
3 dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
jmap -dump:format=b,file=heap.hprof 44808
4 发送堆内存溢出问题 自动dump文件
通常在开发中,JVM参数能够加上下面两句,这样内存溢出时,会自动dump出该文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用
状况、类加载状况等。
github :https://github.com/alibaba/arthas
Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar java -jar arthas-boot.jar # 而后能够选择一个Java进程
Print usage
java -jar arthas-boot.jar -h
version:查看arthas版本号 help:查看命名帮助信息 cls:清空屏幕 session:查看当前会话信息 quit:退出arthas客户端 --- dashboard:当前进程的实时数据面板 thread:当前JVM的线程堆栈信息 jvm:查看当前JVM的信息 sysprop:查看JVM的系统属性 --- sc:查看JVM已经加载的类信息 dump:dump已经加载类的byte code到特定目录 jad:反编译指定已加载类的源码 --- monitor:方法执行监控 watch:方法执行数据观测 trace:方法内部调用路径,并输出方法路径上的每一个节点上耗时 stack:输出当前方法被调用的调用路径