JVM虚拟机-05、JVM调优详解

JVM虚拟机-05、JVM调优详解

1 JVM 参数

1.1 标准参数

-version

-help

-server

-cp

1.2 -X参数

非标准参数,也就是在JDK各个版本中可能会变动

-Xint   解释执行
-Xcomp  第一次使用就编译成本地代码
-Xmixed  混合模式,JVM自己来决定

1.3 -XX 参数

使用得最多的参数类型

非标准化参数,相对不稳定,主要用于JVM调优和Debug

a.Boolean类型
格式:-XX:[+-]<name>      +或-表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC  表示启用CMS类型的垃圾回收器
-XX:+UseG1GC       表示启用G1类型的垃圾回收器
b.非Boolean类型
格式:-XX<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500

1.4 其它参数

-Xms1000等价于-XX:InitialHeapSize=1000
-Xmx1000等价于-XX:MaxHeapSize=1000
-Xss100等价于-XX:ThreadStackSize=100

所以这块也相当于是-XX类型的参数

1.5 查看参数

java -XX:+PrintFlagsFinal -version > flags.txt

值得注意的是"="表示默认值,":="表示被用户或JVM修改后的值

一般要设置参数,可以先查看一下当前参数是什么,然后进行修改

1.6 设置参数的方式

  • 开发工具中设置比如IDEA,eclipse
  • 运行jar包的时候:java -XX:+UseG1GC xxx.jar
  • web容器比如tomcat,可以在脚本中的进行设置
  • 通过jinfo实时调整某个java进程的参数(参数只有被标记为manageable的flags可以被实时修改)

1.7 实践和单位换算

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是字节单位

2 常用命令

2.1 jps

查看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.

2.2 jinfo

(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

2.3 jstat

(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

2.4 jstack

(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锁");
         }
       }
     }
   }
 }
}
  • jstack分析

把打印信息拉到最后可以发现

2.5 jmap

生成堆快照

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

3 常用工具

3.1 JConsole

JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用

情况、类加载情况等。

3.2 jvisualvm

  • 可以监控本地的java进程的CPU,类,线程等
  • 监控远端Java进程

3.3 Arthas

github :https://github.com/alibaba/arthas

Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。

3.3.1 下载安装

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

# 然后可以选择一个Java进程

Print usage

java -jar arthas-boot.jar -h

3.3.2 常用命令

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:输出当前方法被调用的调用路径

如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,

咱们下期见!答案获取方式:已赞 已评 已关~

学习更多JAVA知识与技巧,关注与私信博主(666)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值