Java的dump文件分析及JProfiler使用

这篇具有很好参考价值的文章主要介绍了Java的dump文件分析及JProfiler使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java的dump文件分析及JProfiler使用

1 dump文件介绍

从软件开发的角度上,dump文件就是当程序产生异常时,用来记录当时的程序状态信息(例如堆栈的状态),用于程序开发定位问题。

idea配置发生OOM的时候指定路径生成dump文件

# 指定发生OOM异常的时候,在d盘下生成对应的dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\

2 JProfiler介绍

2.1 下载

JProfiler下载:
链接:https://pan.baidu.com/s/1WXCc4FMOC3QQtjkhY4Qeow
提取码:5xrm
版本:JProfiler 12.0.4

2.2 与idea集成

  1. 本地windows下载并安装好JProfiler

  2. idea安装JProfiler插件
    Java的dump文件分析及JProfiler使用

  3. 指定本地windows的JProfiler路径[settings - tools]

Java的dump文件分析及JProfiler使用
4. 点击图标启动,JProfiler就默认监控到了指定Java程序
Java的dump文件分析及JProfiler使用

2.3 基本使用

①JProfiler基本参数

在概览页我们可以清晰的看到内存使用量、垃圾收集活动、类加载数量、线程个数和状态、CPU 使用率等指标随时间变化的趋势。

Java的dump文件分析及JProfiler使用
通过此图,我们可以作出如下基本判断:

  • 程序在运行过程中会产生大量对象,但这些对象生命周期极短,大部分都能被垃圾收集器及时回收,不会造成内存无限增长。
  • 加载类的数量在程序初始时增长较快,随后保持平稳,符合预期。
  • 在程序运行过程中,有大量线程处于阻塞状态,需要重点关注。
  • 在程序刚启动时,CPU 使用率较高,需要进一步探究其原因。
②测试分析dump文件
  1. 模拟OOM
public class JProfilerTest {
    public static void main(String[] args) throws InterruptedException {
        List<byte[]> list = new ArrayList<>();
        while (true) {
            byte[] bytes = new byte[1024 * 1024 * 50];
            list.add(bytes);
            TimeUnit.SECONDS.sleep(1);
        }
    }
}
  1. 程序添加VM Options
# 监控OOM,发生OOM之后指定dump文件生成到d:\
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\

Java的dump文件分析及JProfiler使用

  1. JProfiler方式启动程序,观察控制台打印

程序运行一段时间之后,发生OOM异常
Java的dump文件分析及JProfiler使用
5. 查看dump文件,用JProfiler打开
Java的dump文件分析及JProfiler使用
6. 分析dump文件
Java的dump文件分析及JProfiler使用

查看最大对象内部结构

Java的dump文件分析及JProfiler使用

可以发现是改list中含有了太多的byte[]数组

ps:其他查看方法类似

3 常见JVM问题

3.1 OOM

①堆溢出

原因:

1. 无法在Java堆中分配对象
2. 应用程序保存了无法被GC回收的对象
3. 程序过度使用finalizer

排查思路:

  1. 查看关键报错信息
  2. 使用内存映像分析工具(MAT或JProfiler)分析dump文件,分析是内存泄漏还是内存溢出
  3. 如果是内存泄漏,通过工具查看泄漏对象到GC Roots引用链,修复内存泄漏
  4. 如果不是,检查代码是否有死循环,递归等,再考虑用-Xmx增加堆大小

demo代码JVM配置参数:

  • -Xms20m JVM初始分配的内存20m
  • -Xmx20m JVM最大可用内存为20m
  • -XX:+HeapDumpOnOutOfMemoryError 当JVM发生OOM时,自动生成DUMP文件
  • -XX:HeapDumpPath=/Users/mytest/Desktop/dump/ 生成DUMP文件的路径
②栈溢出

栈:虚拟机栈和本地方法栈,关于栈,Java虚拟机规范中描述了两种异常:

  • StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度
  • OOM:如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出

原因:

1. 单个线程下,栈帧太大或虚拟机栈容量太小,内存无法分配
2. 不断建立线程

排查思路:

  • 查看关键报错信息,确定是StackOverflow还是OOM
  • 如果是StackOverflow,检查代码是否存在递归
  • 如果是OOM,检查是否有死循环创建线程或调用第三方接口创建线程,通过-Xss降低每个线程栈大小
③方法区溢出

方法区(又叫永久代,JDK8之后元空间替换了永久代),用于存放Class的相关信息,如:类名、访问修饰符、常量池、字段描述、方法描述等。运行时产生大量的类,会填满方法区,造成溢出。

溢出原因:

1. 使用CGLib生成大量代理类
2.Jdk7之前,频繁错误的使用String.intern方法
3. 大量jsp和动态产生jsp
4. 应用长时间运行,没有重启

排查思路:

  • 检查是否永久代空间设置的过小
    -XX:MetaspaceSize=10M -XX:MaxMetaspaceSize=10M
  • 是否频繁错误使用String.intern
  • 是否与jsp有关
  • 是否使用CGLib生成大量代理类
  • 重启JVM
④直接内存溢出

直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是,这部分也被频繁的使用,也可能导致OOM。

原因:

1. 本机直接内存不受到Java堆大小限制,但是受到本机总内存大小限制
2. 直接内存由-XX:MaxDirectMemorySize指定,如果不指定,默认与Java堆最大值
	一样(-Xmx3. NIO程序中,使用ByteBuffer.allocateDirect(capability)分配的是直接内
	存,可能导致直接内存溢出

排查思路:

  • 检查代码是否恰当
  • 检查JVM参数-Xmx(java堆最大值),-XX:MaxDirectMemorySize是否合理

参考:https://zhuanlan.zhihu.com/p/95150243文章来源地址https://www.toymoban.com/news/detail-456522.html

到了这里,关于Java的dump文件分析及JProfiler使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题

    目录 1、尝试将Windbg附加到目标进程上进行动态调试,但Windbg并没有捕获到

    2024年02月14日
    浏览(41)
  • mac pro m1:安装dump文件内存分析工具——MAT

    本文主要针对mac m1下安装Jprofiler进行讲解,安装核心步骤同样适用于其他系统 如果使用的是eclipse可以在插件中直接安装MAT,因为我使用的是idea开发,所以选择独立安装MAT工具 1、下载地址:https://www.eclipse.org/mat/downloads.php 选择你需要的版本,这里我选择的mac arm架构版,注意

    2024年02月06日
    浏览(43)
  • 【Java基础】- JVM之Dump文件详解

    学习Jvm调优,我们会接触到Dump文件。什么是Dump文件、Dump文件是如何得到的。当程序崩溃时,如何从Dump文件还原崩溃时的信息。本文讲重点讲解。 Thread Dump是非常有用的诊断Java应用问题的工具。每一个Java虚拟机都有及时生成所有线程在某一个点状态的thread-dump的能力,虽然

    2024年02月13日
    浏览(43)
  • JVM分析工具JProfiler介绍及安装

    目录 一、什么是JProfiler? 二、JProfiler 功能结构  1、分析代理 2、记录数据 3、快照 三、安装  JProfiler是一个专业的工具,用于分析运行中的JVM内部发生的事情。当您的生产系统出现问题时,您可以在开发、质量保证和消防任务中使用它。 JProfiler主要处理四个主题: 方法调

    2024年02月14日
    浏览(45)
  • 用jprofiler来分析 jvm 堆 内存泄露,fullgc

    jvm 命令和工具_个人渣记录仅为自己搜索用的博客-CSDN博客   方法1: 重新设置堆后,重启,复现.   方法2:  切割  官网文档 JProfiler Help - HPROF snapshots heap walker教学: 用jprofile查看hprof文件_hprof jprofile_java老张的博客-CSDN博客 通识教学: JVM监控及诊断工具GUI篇之JProfiler_每天都要进步一

    2024年02月08日
    浏览(99)
  • Linux 中 core dump 文件的作用和使用方法

    Core dump 文件是指在程序崩溃或异常结束时,操作系统将程序的内存信息、寄存器状态、堆栈信息等保存到文件中以便进行调试和分析的文件。Core dump 文件通常包含了程序崩溃时的全部状态信息,可以帮助程序员快速定位程序崩溃的原因并进行修复。 core dump文件主要包含了用

    2024年02月03日
    浏览(39)
  • 【JVM 监控工具】性能诊断--JProfiler的使用

    性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。Java 作为最流行的编程语言之一,其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能问题的因素非常多,例如线程控制、

    2024年02月08日
    浏览(59)
  • Java 内存溢出(二)使用 MAT 分析 .hprof 内存映像文件

    .hprof 文件: 是 java 项目的 Heap Dump 文件,也叫内存映像文件、内存快照文件,可以存放一个 java 进程在某个时间点的内存快照。生成 Heap Dump 文件的方式有两种:一是使用 jmap 命令手动导出,二是启动脚本中添加 -XX:+HeapDumpOnOutOfMemoryError 参数自动导出。本文中只涉及第二种。

    2023年04月08日
    浏览(71)
  • 【jvm系列-09】垃圾回收底层原理和算法以及JProfiler的基本使用

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2023年04月22日
    浏览(76)
  • 生成和查看dump文件

    在日常开发中,即使代码写得有多谨慎,免不了还是会发生各种意外的事件,比如服务器内存突然飙高,又或者发生内存溢出(OOM)。当发生这种情况时,我们怎么去排查,怎么去分析原因呢? 内存溢出 虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包