首页 > 系统相关 >java内存分析工具使用

java内存分析工具使用

时间:2023-07-22 14:55:24浏览次数:44  
标签:java dump 对象 GC 内存 工具 引用

目录

参考链接

Java内存溢出OOM之dump分析

1、名词解释

内存泄露:代码中的某个对象本应该被虚拟机回收,但是因为GCRoot引用而没有被回收。

内存溢出:虚拟机由于堆中拥有太多不可回收对象没有回收,导致无法继续创建新对象。

2、常见异常

java堆内存异常

java.lang.OutOfMemoryError: Java heap space

原因:异常导致-Xms或-Xmx配置不足。(注意,-Xmx 堆内存的最大大小,默认为物理内存的1/4,-Xms 堆内存的初始大小,默认为物理内存的1/64,-Xmn 堆内新生代的大小。通过这个值也可以得到老生代的大小:-Xmx 减去 -Xmn。

  • 使用了大量的递归或无限递归对象。
  • 使用了大量循环或死循环(循环中用到了大量的新建的对象)。
  • 使用了向数据库查询过多,可能会造成内存溢出。
  • 有数组,List,Map中存放的是对象的引用而不是对象,这些引用会让对应的对象不能被释放。会大量存储在内存中。

java栈内存异常

Exception in thread "main" java.lang.StackOverflowError

原因:对象过大或过多异常,导致-Xss配置的内存不足。(注意,设置每个线程可使用的内存大小,即栈的大小。大小设置需要注意,太小了容易栈溢出,太大了影响创建栈的数量。双刃剑,看把握。

  • 是否有递归调用。
  • 是否有大量循环或死循环。
  • 全局变量是否过多。
  • 数组、List、map数据是否过大。

方法区内存异常

Exception in thread "main" java.lang.OutOfMemoryError: Metaspace

原因:异常导致-XX:MetaspaceSize或-XX:MaxMetaspaceSize配置不足。

3、解决思路

》通过日志文件,定位异常代码位置,分析问题原因。

》当不通过日志文件主观来判断出问题代码时,通过dump文件来分析。

》上 Arthas 工具。

4、生成dump文件的三种方式

jvisualvm

说明:jvisualvm 控制台,监控时主动生成dump文件。

  • 有界面,可以指定发生 OOM 时生成 dump,可以用 everything 工具搜索保存的路径,文件名称为 java_pidxxxx.hprof。

  • jvisualvm.exe 工具在本地 java 的 jdk 安装路径,一般在 bin 目录里,如:D:\dev\java\jdk1.8.0_172\bin\jvisualvm.exe

  • 可以实时监控 cpu、内存、类、线程等的运行情况。

  • 生成的 *.hprof 文件,可以使用 MAT工具进行分析,全称:Memory Analyzer。

jmap命令

说明:使用jmap命令生成dump文件

windows环境:

jmap -dump:live,format=b,file=heap.hprof <pid>  // tasklist | grep xxx

linux环境:

jmap -dump:live,format=b,file=heap.hprof <pid>     // ps -elf | grep xxx

[zoms@ocs ~]$ jmap -dump:live,format=b,file=heap-vm.hprof 15463
Dumping heap to /home/zoms/heap-vm.hprof ...
Heap dump file created

应用启动配置

说明:在应用启动时配置添加 -XX:+HeapDumpOnOutOfMemoryError 参数。此时如果应用抛出 OutOfMemoryError 时,会自动生成 dump 文件。

目录指定:XX:HeapDumpPath。(不指定则在对应工程目录下面,找 java_pidxxxx.hprof 文件)

注:如果打开 Edit Configuration 里面,没有 VM options 的选项,可以点击 Modify options,将其添加上。

举例:

1、设置上下限分别是20,40

-Xms20m -Xmx40m -XX:+HeapDumpOnOutOfMemoryError

2、运行测试代码,生成dump文件。

3、使用MAT打开,并进行分析。

5、Memory Analyzer 分析工具

1、基础步骤:

》打开软件,File-Open Heap Dump,在开始向导中勾选第一个(Leak Suspects Report).

》Overview,内存的整体情况。

》点击下面的Reports-Leak Suspects,生成报告,查看导致内存泄露的罪魁祸首。

》根据饼图以及下方的报告说明,来分析内存泄露的具体原因。

》点击报告中Details链接,可以看到更加详细的列表说明项,其中:

Shallow Heap:为对象自身占用的内存大小,不包括它引用的对象。

Retained Heap:为当前对象大小 + 当前对象可直接或间接引用到的对象的大小总和。

2、Overview页面的常用的Actions:

Histogram:查看每个类的对象实例的个数。

详情页功能:

1)对象的引用与被引用 : 右键点击某对象 , 选择 List objects 选项 ;

》查看该对象引用了哪些对象 : 选择 with incoming reference 选项 ;

》查看该对象被哪些对象引用 : 选择 with outgoing reference 选项 ;

2)查看对象到GC Roots的最短距离:

在右键菜单中选择 " Merge Shortest Paths to GC Roots " , 这里就可以看到为什么对象可达性分析时 , 某些对象应该释放 , 却仍然存在与 GC Root 对象之间的引用链 ;

GC Roots 与 GC 垃圾回收:存在与 GC Roots 引用链导致内存泄漏 : 该对象可能与 GC Root 对象不是直接引用 , 而是由其它对象简介引用 , 导致存在这么一条引用链 ;

在查询到GC root的路径时,默认是包含所有引用的,从GC角度说,一个对象无法被GC,一定是因为有强引用存在,其它引用类型在GC需要的情况下都是可以被GC掉的,所以这里我们一般使用 exclude all phantom/weak/soft etc. references,即只查看GC路径上的强引用。

上图标识了从当前对象到GC roots的路径,这个路径解释了为什么当前对象还能存活,对分析内存泄露很有帮助。

标签:java,dump,对象,GC,内存,工具,引用
From: https://www.cnblogs.com/selonsy/p/17573370.html

相关文章

  • java源码加密代码
    1、java代码想加密怎么处理?2、java加密解密代码3、如何有效防止Java程序源码被人偷窥?4、Java编程实现将文件加密,将源程序补充完整5、用java写个文件加密的代码该怎么写6、java项目如何加密?java代码想加密怎么处理?只给编译后java源码加密的.jar文件java源码加密,不给......
  • java开发工程师工作总结
    1、java主要是做什么的?2、java核心思想小结3、javaweb开发需要哪些技术请总结全点4、为什么java开发游戏性能和效率差java主要是做什么的?、科学应用现在Java经常是科学应用java开发年终总结的默认选择java开发年终总结,包括了自然语言处理。这主要的原因是因为Java比起C+......
  • 修改java路径
    修改Java路径在进行Java编程时,我们经常需要配置Java的路径。Java路径包括JavaDevelopmentKit(JDK)的安装路径和JavaRuntimeEnvironment(JRE)的安装路径。本文将为您介绍如何修改Java路径,并提供代码示例来帮助您更好地了解这个过程。为什么需要修改Java路径?在某些情况下,......
  • JavaNote-概述及安装
    1.Java语言概述1.1Java概述是SUN(StanfordUniversityNetwork,斯坦福大学网络公司)1995年推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序(Applet),内嵌在HTML代码中。伴......
  • Javaswing 改变页面时不刷新
    Javaswing改变页面时不刷新的实现作为一名经验丰富的开发者,我将教会你如何实现在Javaswing中改变页面时不刷新的功能。首先,让我们来了解整个实现过程的流程,然后逐步介绍每个步骤需要做的事情和相应的代码。实现流程下面是实现Javaswing改变页面时不刷新的流程,可以使用表格......
  • Java增量业务
    实现Java增量业务流程引言在软件开发过程中,有时候需要对已有数据进行增量更新,而不是对整个数据集进行处理。在Java中,可以通过一些类库和技巧实现增量业务。本文将介绍实现Java增量业务的流程,并提供示例代码供参考。流程下表展示了实现Java增量业务的流程步骤:步骤描述......
  • JavaScript多线程
    JavaScript多线程实现流程1.基本概念在开始讲解JavaScript多线程之前,我们需要先了解一些基本概念。单线程:JavaScript是一门单线程语言,即每次只能执行一项任务。这是因为JavaScript的设计初衷是用于前端交互和操作DOM,多线程会带来复杂性和安全性问题。多线程:多线程指的是同时......
  • JavaScript报告总结1300字
    JavaScript报告总结介绍JavaScript是一种轻量级的、解释性的编程语言,用于网页开发。它被广泛应用于前端开发,并且也可以运行在服务器端。本文将介绍JavaScript的一些基本概念和特性,并通过代码示例来说明。变量和数据类型在JavaScript中,使用var关键字来声明变量。变量可以存储不......
  • Java用icmp获取电脑信息
    实现Java用icmp获取电脑信息作为一名经验丰富的开发者,我很乐意教会你如何使用Java来通过icmp获取电脑信息。在本篇文章中,我将向你解释整个流程,并提供每个步骤需要做的事情,包括相应的代码和代码注释。整个流程下面是实现Java用icmp获取电脑信息的流程,我们将在接下来的步骤中逐一......
  • JavaBean 跟类 区别
    JavaBean跟类区别在Java编程中,JavaBean和类是两个非常重要的概念。它们在语法和用途上存在一些区别。本文将介绍JavaBean和类之间的区别,并通过代码示例进行说明。1.类的定义在Java中,一个类是一个抽象的概念,用于描述具有相同属性和行为的对象的模板。类由属性和方法组成,用于定......