JVM学习二

简介: jvm监控排查问题相关工具:jps、jstat、jinfo、jhat、jstack、jconsole、jmap、MAT、Btrace、psi_probe监控tomcat,通过gceasy查看和GCViewer查看GC,从而解决问题。

jvm监控排查问题相关工具:

jps、jstat、jinfo、jhat、jstack、jconsole、jmap、MAT、Btrace、psi_probe监控tomcat,通过gceasy查看和GCViewer查看GC,从而解决问题。

jps:查看所有的java进程

jps-help#显示jps所有的命令参数信息jps#查看有哪些运行的java线程jps-l#输出主类的全名jps-v#输出虚拟机启动时的jvm参数jps-m#输出传递给java进程main()函数的参数

jstat:监视虚拟机各种运行状态信息:主要是查看类加载、垃圾回收、JIT编译、新生代、老年代等

jstat-help#显示jsta命令所有的参数信息jstat-classvmid#显示ClassLoader的相关信息jstat-compilervmid#显示JIT编译的相关信息jstat-gcvmid#显示与GC相关的堆信息jstat-gcnewvmid#显示新生代信息jstat-gcoldvmid#显示老年代信息jstat-gcnewcapcacityvmid#显示新生代大小使用情况jstat-gcoldcapcacityvmid#显示老年代大小使用情况jstat-gcutilvmid#显示垃圾收集信息#当然也可以在里面加上时间和次数,以上如果不加时间和次数,默认打印一次,如:jstat-classvmid时间次数jstat-gcvmid时间次数

jinfo:实时查看和调整虚拟机各项参数

jinfo-help#产看jinfo的相关命令参数信息jinfo-flagMaxHeapSizevmid#查看最大堆内存的大小jinfo-flagUseConcMarkSweepGCvmid#查看垃圾回收器jinfo-flagUserG1GCvmid#查看垃圾回收器jinfo-flag+PrintGCvmid#开启查看GC打印日志信息

jhat:分析heapdump文件,在浏览器上查看分析结果

jhat-help#查看jhat所有命令参数信息jhatC:\Users\Administrator\Desktop\heap.hprof

jstack:生成虚拟机当前时刻的线程快照,可以进行日志分析,定位线上问题。

死锁:A线程和B线程相互获取资源,都在等待对方,导致死锁

publicclassDeadLockDemo {
privatestaticObjectresource1=newObject();//资源 1privatestaticObjectresource2=newObject();//资源 2publicstaticvoidmain(String[] args) {
newThread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() +"get resource1");
try {
Thread.sleep(1000);
                } catch (InterruptedExceptione) {
e.printStackTrace();
                }
System.out.println(Thread.currentThread() +"waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() +"get resource2");
                }
            }
        }, "线程 1").start();
newThread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() +"get resource2");
try {
Thread.sleep(1000);
                } catch (InterruptedExceptione) {
e.printStackTrace();
                }
System.out.println(Thread.currentThread() +"waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() +"get resource1");
                }
            }
        }, "线程 2").start();
    }
}

由于两者之间相互等待,所以运行时间很长,程序没有结果,因此可以通过查看进程jps拿到程序的进程信息,从而通过jstack 进程id,从而获取详细的日志信息。

jdk可视化工具分析:jconsole,内存监控和线程监控

可进行远程监控,方便线上排查问题

如果需要使用 JConsole 连接远程进程,可以在远程 Java 程序启动时的配置文件上加上下面这些参数:

-Djava.rmi.server.hostname=外网访问ip地址-Dcom.sun.management.jmxremote.port=60001//监控的端口号-Dcom.sun.management.jmxremote.authenticate=false//关闭认证-Dcom.sun.management.jmxremote.ssl=false

在使用 JConsole 连接时,远程进程地址如下:

外网访问ip地址:60001

连接好就可以查看监控信息了

jmap:生成堆转储快照

jps-l#拿到pid信息jmap-dump:format=b,file=heap.hprofpid#b表示二进制,生成文件heap.profjmap-heappid#内存区块信息

此时可以配合MAT分析内存溢出的信息,导入映像文件,进行查看。

java线程的状态:

NEW:线程还没开始

WAITING:等待状态

RUNNABLE:运行状态

TIMED_WAITING:限时等待

BLOCKING:阻塞等待状态

TERMINATED:终止退出

基于jvisualvm的可视化监控:

监控本地tomcat、监控远程tomcat、监控普通java进程等都可以。

监控远程tomcat,需要修改tomcat的配置文件catalina.sh添加如下信息:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=9004-Dcom.sun.management.jmxremote.anthenticate=false-Dcom.sun.management.jmxremote.jmxremote.ssl=false-Djava.net.preferIPV4Stack=true-Djava.rmi.server.hostname=10.19.10.10"

添加完连接信息之后,就可以进行jmx连接了。

监控远程tomcat:

基于Btrace的监控调试,Btrace可以动态地向母亲应用程序的字节码注入跟踪代码。

javaComplierApi:JVMTI、Agent、Instrumentation+ASM

Btrace安装:

新建环境变量,添加path.,类似eclipse。

两种运行脚本方式:在jvisualvm添加Btrace插件,添加classpath,类似配置jconsole.

使用命令行btrace

三个jar包引入pom文件:Btrace-agent.jar、Btrace-boot.jar、Btrace-client.jar

@Btrace注解:

@OnMethod(clazz="com.study.mt.testController",method="arg1",localtion=@Localtion(kind.ENTRY))

命令:

jps-lbtracepidprintArgSimple.java

可以采用命令启动,也可以在jvisualvm中使用

Btrace使用:

拦截方法:

普通方法,@OnMethod(clazz=" ",method=" ")
构造方法:@OnMethod(clazz="",method="<init>")
拦截同名函数,用参数区分

拦截时机:入口、运行、结束等

kind.Entry:入口,默认值kinf.RETURN:返回kind.THROW:异常kind.LINE=

异常吞掉也没关系,BTrace也可以追踪,方便排查问题

BTrace只能本地运行,如果需要远程连接,则需要修改源代码

拦截this、参数、返回值:

this:@self入参:可以用AnyType,也可以用真实类型,同名的用真实的返回值:@return

其他:获取对象的值

简单类型:直接获取复杂类型:发射、类名+属性名

注意:生产环境下使用,需要注意被修改的字节码不会被还原

tomcat性能调优:首先需要修改tomcat的配置文件:tocat-user.xml、添加manager.xml:

tocat-user.xml添加几个角色信息:

<rolerolename="tomcat"/><rolerolename="manager-status"/><rolerolename="manager-gui"/><roleusername="tomcat"password="tomcat"roles="tomcat,managet-status,managet-gui"/>

manager.xml配置如下信息:

<contextprovileged="true"antiResourceLock="false"docBase='${catalina.home}/webapps/manager'><ValveclassName="org.apache.catalina.valves.RemoteAddrValve"allow="^192.168.*$"/></Context>

访问远程tomcat的管理页面,可以在server.status中查看到jvm参数信息。

除了使用tomcat的管理页面看到tomcat的jvm信息之外,还可以通过psi_probe监控看到相关参数信息,需要配置tomcat-user.xml和manager.xml的配置,放入到tomcat下面即可。

目录
相关文章
|
5月前
|
Oracle Java 编译器
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
基本概念【入门、 发展简史、核心优势、各版本的含义、特性和优势、JVM、JRE 和 JDK 】(二)-全面详解(学习总结---从入门到深化)
82 1
|
8天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
29 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
8天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
15 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
8天前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
18 4
|
8天前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
25 3
|
8天前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
18 3
|
8天前
|
缓存 前端开发 Java
JVM知识体系学习二:ClassLoader 类加载器、类加载器层次、类过载过程之双亲委派机制、类加载范围、自定义类加载器、编译器、懒加载模式、打破双亲委派机制
这篇文章详细介绍了JVM中ClassLoader的工作原理,包括类加载器的层次结构、双亲委派机制、类加载过程、自定义类加载器的实现,以及如何打破双亲委派机制来实现热部署等功能。
19 3
|
8天前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
24 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
4月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
44 0