JVM 问题排查-可视化工具

JVM 问题排查-可视化工具

jconsole

JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。
命令行中输入:jconsole

jvisualvm

命令行中输入:jvisualvm
Visual GC插件下载地址 :https://visualvm.github.io/pluginscenters.html

可以监控本地的java进程的CPU,类,线程等

在线调试Arthas

Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器。
github :https://github.com/alibaba/arthas

下载安装
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
or
java -jar arthas-boot.jar -h # 然后可以选择一个Java进程

输入dashboard可查看整个进程的运行情况,线程、内存、GC、运行环境信息:

在这里插入图片描述

输入thread可以查看线程详细情况:
在这里插入图片描述

输入 thread加上线程ID 可以查看线程堆栈:
在这里插入图片描述
输入thread -b 可以查看线程死锁:
在这里插入图片描述

输入jad加类的全名可以反编译, 这样可以方便我们查看线上代码是否是正确的版本。

Arthas 命令集

基础命令:

  • help——查看命令帮助信息
  • cat—打印文件内容,和linux里的cat命令类似
  • grep——匹配查找,和linux里的grep命令类似
  • pwd——返回当前的工作目录,和linux命令类似
  • cls——清空当前屏幕区域
  • session——查看当前会话的信息
  • reset (opens new window)——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version——输出当前目标 Java 进程所加载的 Arthas 版本号
  • history——打印命令历史
  • quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
  • stop/shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
  • ——Arthas快捷键列表及自定义快捷键

jvm相关:

  • dashboard (opens new window)——当前系统的实时数据面板
  • thread (opens new window)——查看当前 JVM 的线程堆栈信息
  • jvm (opens new window)——查看当前 JVM 的信息
  • sysprop (opens new window)——查看和修改JVM的系统属性
  • sysenv (opens new window)——查看JVM的环境变量
  • vmoption (opens new window)——查看和修改JVM里诊断相关的option
  • logger (opens new window)——查看和修改logger
  • getstatic (opens new window)——查看类的静态属性
  • mbean (opens new window)——查看 Mbean 的信息
  • heapdump (opens new window)——dump java heap, 类似jmap命令的heap dump功能

class/classloader相关:

  • sc (opens new window)——查看JVM已加载的类信息
  • sm (opens new window)——查看已加载类的方法信息
  • jad (opens new window)——反编译指定已加载类的源码
  • mc (opens new window)——内存编绎器,内存编绎.java文件为.class文件
  • redefine (opens new window)——加载外部的.class文件,redefine到JVM里
  • dump (opens new window)——dump 已加载类的 byte code 到特定目录
  • classloader (opens new window)——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关:

这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令

  • monitor (opens new window)——方法执行监控
  • watch (opens new window)——方法执行数据观测
  • trace (opens new window)——方法内部调用路径,并输出方法路径上的每个节点上耗时
  • stack (opens new window)——输出当前方法被调用的调用路径
  • tt (opens new window)——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

内存分析MAT

Java堆分析器,用于查找内存泄漏 Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照。
它在触发快照的时候保存了很多信息:Java对象和类信息。通常在写Heap Dump文件前会触发一次Full GC。
下载地址 :https://www.eclipse.org/mat/downloads.php

获取dump文件
手动:jmap -dump:format=b,file=heap.hprof 44808
自动:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof

Dump的信息:
All Objects
Class, fields, primitive values and references
All Classes
Classloader, name, super class, static fields
Garbage Collection Roots
Objects defined to be reachable by the JVM
Thread Stacks and Local Variables
The call-stacks of threads at the moment of the snapshot, and per-frame information about
local
objects

使用:
Histogram:可以列出内存中的对象,对象的个数及其大小
Class Name:类名称,java类名
Objects:类的对象的数量,这个对象被创建了多少个
Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和

右击类名—>List Objects—>with incoming references—>列出该类的实例

右击Java对象名—>Merge Shortest Paths to GC Roots—>exclude all …—>找到GCRoot以及原因

Leak Suspects:查找并分析内存泄漏的可能原因:Reports—>Leak Suspects—>Details
Top Consumers:列出大对象

heaphero

https://heaphero.io/

GC日志分析

要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下,根据前面参数的学习,下
面的配置很容易看懂。比如打开windows中的catalina.bat,在第一行加上

XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log

不同收集器日志
(1)Parallel GC:【吞吐量优先】

2019-06-10T23:21:53.305+0800: 1.303: [GC (Allocation Failure)
 [PSYoungGen: 65536K[Young区回收前]->10748K[Young区回收后](76288K[Young区总大小])]
            65536K[整个 堆回收前]->15039K[整个堆回收后](251392K[整个堆总大小]),
            0.0113277 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

在这里插入图片描述
(2)CMS:【停顿时间优先】
参数设置:-XX:+UseConcMarkSweepGC -Xloggc:cms-gc.log
这里产生的日志格式和上面差不多。

(3)G1:【停顿时间优先】
参数设置:-XX:+UseG1GC -Xloggc:g1-gc.log
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GCViewer
java -jar gcviewer-1.36-SNAPSHOT.jar

gceasy
http://gceasy.io

gcplot
https://it.gcplot.com/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java内存溢出可能有多种原因,其中一种可能是程序中的内存泄漏,另一种可能是程序中的无限循环。要排查内存溢出,可以使用内存分析工来查找内存中的问题,也可以检查程序中是否有内存泄漏或无限循环,并采取相应措施来解决这些问题。 ### 回答2: Java内存溢出是指程序在运行过程中申请的内存超过了Java虚拟机所能提供的最大内存限制,导致程序异常终止或出现错误。为了排查Java内存溢出问题,可以采取以下几个步骤: 1. 检查错误信息:查看程序的错误日志或控制台输出,通常会提示内存溢出的错误信息。错误信息可能包括“java.lang.OutOfMemoryError”等相关信息,能够帮助我们定位问题。 2. 分析堆栈信息:出现内存溢出时,通常会在堆栈信息中找到一些线索。查看堆栈信息,找出哪些方法或代码片段出现频繁调用,占用大量内存的可能性较大。 3. 使用工分析内存:使用一些Java内存分析工,如Eclipse Memory Analyzer(MAT)、VisualVM等,可以帮助我们定位问题。这些工能够生成内存快照,并提供一个可化界面来查看内存使用情况、对象引用关系等。通过分析内存快照,我们可以找到内存泄漏或过多使用内存的问题。 4. 代码审查:检查程序的代码,查看是否有明显的内存泄漏问题。例如未关闭数据库连接、未释放资源等。 5. 调整堆内存大小:可以通过增大Java虚拟机的堆内存限制来缓解内存溢出的问题。可以通过设置JVM选项-Xmx和-Xms来增大最大堆和初始堆的大小。 总之,Java内存溢出问题排查需要结合错误信息、堆栈信息、内存分析工等多种方法,并进行深入分析和定位。通过找出导致内存溢出的体原因,以便采取相应的措施解决问题。 ### 回答3: Java内存溢出是指在程序运行过程中,因为申请的内存超过了JVM堆内存的限制,导致程序抛出OutOfMemoryError异常的情况。接下来我们将介绍一些排查内存溢出的常用方法。 第一步是分析错误日志。当程序抛出内存溢出异常时,JVM会生成错误日志文件,其中包含了异常的堆栈信息以及可能的原因。通过分析错误日志,我们可以初步了解是哪一部分代码导致了内存溢出。 第二步是使用内存分析工。常用的内存分析工有VisualVM、Eclipse Memory Analyzer等。这些工可以帮助我们查看内存使用情况、对象的引用关系以及内存泄漏等信息。通过分析内存快照,我们可以找到内存溢出的体原因。 第三步是检查代码中的资源泄漏问题。在Java程序中,未正确关闭的资源(如文件流、数据库连接等)会导致内存泄漏。因此,我们需要仔细检查代码,确保使用完资源后及时关闭。 第四步是调整JVM参数。通过调整JVM参数,可以增加JVM堆内存的大小或优化垃圾回收机制,以减少内存溢出的风险。常用的参数有-Xmx、-Xms和-XX:MaxPermSize等。 最后一步是代码优化。如果经过以上步骤仍然无法解决内存溢出问题,那么可能是代码设计存在问题。我们需要检查代码中是否有频繁创建大量对象的情况,是否有不必要的数据缓存等,以优化代码并降低内存消耗。 总之,解决Java内存溢出问题需要结合分析错误日志、使用内存分析工、检查资源泄漏、调整JVM参数和代码优化等多个步骤,以找到并解决问题的根源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值