性能测试分析-Java内存溢出定位案例(1)

news2025/1/24 18:03:45

Java内存溢出分析案例

  • Java常见内存溢出类型:
  • 堆内存溢出现象
  • 内存溢出分析
    • 下载安装分析软件
    • 下载 hprof 文件
    • MAT 分析定位问题
      • Shortest Paths To the Accumulation Point
  • 内存溢出分析
  • 参考文档:

Java常见内存溢出类型:

常见的内存溢出主要有以下几种:
1、堆内存溢出(OutOfMemoryError:java heap space)
2、栈内存溢出(StackOverflowError)
3、永久代溢出(OutOfMemoryError:PermGen sapce)等

其中,堆内存溢出较为常见,堆内存是 Java 应用程序运行时所需要的内存空间,
应用程序如果分配堆内存太小或者造成垃圾回收无法及时进行,
都会导致堆内存溢出。
栈内存溢出较为少见,通常是调用栈的深度过多或者资源占用过多导致。
如果使用递归算法或者在方法中创建大量的局部变量等情况下容易发生栈溢出

堆和栈的区别:

  • 栈内存:栈内存是线程私有的,用于存储程序执行过程中方法调用和参数传递(即局部变量)等数据。在线程结束时,栈内存也会随之销毁。栈内存大小由系统自动管理,一般较小,若数据量超过限制,可能会导致栈溢出错误。

  • 堆内存:堆内存是所有线程共享的内存空间,用于存储对象数据,包括实例对象、类对象等。Java 虚拟机在启动时即从系统中分配一定的堆空间,并动态地增加或缩减堆的大小以满足应用程序的需要。由于堆内存是由 JVM 管理,所以存放了大量数据对象后可以调用 JVM 垃圾回收机制进行回收,避免了栈溢出的问题。

  • 内存分配方式:栈内存的分配和释放速度比堆内存更快,但是空间较小,它使用“先进先出”的方式对存储和释放内容进行管理。而堆内存的分配和释放速度要慢一些,但是空间相对较大且灵活易用,允许程序员通过 new 和其他方式进行自由分配、释放,需要程序员自主管理。

  • 存储的数据类型:栈内存只能存储基本数据类型和对象的引用(reference),而不能存储对象本身;堆内存则可以存储任何类型的对象,包括 Java 实例对象、数组、字符串、类信息等。

堆内存溢出现象

(此篇文章主要是针对堆内存溢出的分析案例)

1、Tps波动大,并慢慢降低,也有会变为0,响应时间也会随着波动,变高
2、通过jstat -gcutil 命令看到,FullGC可能非常频繁,对应的FullGC消耗的时间也会不断增加
3、通过jconsole/jvisualvm观察,堆内存曲线不断上升,逐渐达到上线,然后变成一直线
4、内存溢出到最后应用服务崩溃,日志报错java.Iang.OutOfMemoryError: Java heap space

正常情况下,堆是锯齿状的波动
在这里插入图片描述
异常情况下,堆内存慢慢往上爬
在这里插入图片描述

内存溢出分析

可以使用Mat工具分析

下载安装分析软件

在本机并建立一个新的文件夹,下载单机版本的mat(MemoryAnalyzer(JDK8)) 内存分析工具(不要下载新版,下载可支持1.8的)

下载 hprof 文件

1、可以直接用jvisualvm 点击dump,然后会在服务器上生成hprof堆内存文件。
在这里插入图片描述
2、也可以直接在服务器上使用命令敲

jmap -dump:format=b, file=xx.hprof PID

MAT 分析定位问题

打开Mat,导入刚开下载的hrpof文件
在这里插入图片描述
点击overview全局页面,再点击Leak Suspects:
内存溢出只需要关注这个功能就好了,这里展示了它怀疑内存溢出的所有问题
在这里插入图片描述
进入后可以看到整个页面如下:
前两个问题占用了90%,其中第一个占了将近80%
在这里插入图片描述
从图片中可以看到第一个问题,这个问题是entity.LinkInfo对象引起的,这个对象的类型是数组类型。也就是提示有大对象数组没有。keywords 也提示这个是数组对象
更详细的分析可以点击detail可以看到:

Shortest Paths To the Accumulation Point

表示GC root到内存消耗聚集点的最短路径,如果某个内存消耗聚集点有路径到达GC root,则该内存消耗聚集点不会被当做垃圾被回收
点击左上角,可以看到这个thread 是gc root,linkinfo跟它有关联,意味着linkinfo 对象不会被回收。
在这里插入图片描述

为啥gcroot 有关联就回收不了呢?
这是由于java的垃圾回收算法决定的:

GCRoot 是指一系列在程序运行过程中始终存在的引用,它们被作为垃圾收集的根节点,用于标识可达对象。只要程序的任何一个变量、静态成员或已加载类实例还存活下来,那么该对象就会被认为是无法回收的。因此,垃圾回收算法从 GCRoot 出发遍历所有可达对象,识别并确认所有已死亡的对象,将其空间回收以供后续使用

简单来说就是没有路径到达gcroot 的对象就是可以回收的。如下图,5、6、7是可以回收的对象,1、2、3、4则无法回收

在这里插入图片描述
如何看对象引用到了哪个gc root 。可以点击

merge shortest paths to gc roots

在这里插入图片描述

选择exclude all phantom/weak/soft etc.references,意思是查看排除虚引用/弱引用/软引用等的引用链,
因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个对象否还存在Strong 引用链

可作为GCRoot的对象有:

  1. 本地方法栈中的JNI引用的对象
  2. 方法区中的类静态变量引用的对象
  3. 方法区中的常量引用的对象
  4. Java虚拟机栈中引用的对象:

从最后的thread stack可以看到以下报错原因:
使用async 注解异步执行该任务,添加list对象数据的时候内存不够了,内存溢出了。

在这里插入图片描述

内存溢出分析

知道了哪个对象内存溢出,就需要根据代码判断是什么问题导致的。

性能分析中,定位到了问题也只是成功了一半,要能分析并解决问题才算是完全成功。

这个对象是写在java bean的,java bean 对象没有被释放,可能原因会有:
1、多线程发编程,对象被某些线程使用而未被释放:在某些情况下,Java Bean对象可能正在被某些线程所使用,这些线程持有对该对象的引用,使其不能被垃圾回收机制回收。在这种情况下,必须等到所有线程完成对该对象的操作后,才能使该对象成为垃圾对象。
2、异常未处理,在 Java Bean 对象使用过程中,如果发生异常或者错误,没有及时释放相关资源(例如文件句柄、数据库连接等),也会导致 Java Bean 对象没有被及时释放
3、使用静态变量保存对象
4、对象被循环引用

代码还在分析优化中,未完待续。。。。。

参考文档:

https://www.cnblogs.com/trust-freedom/p/6744948.html
https://www.cnblogs.com/feng-gamer/p/6039390.html
https://blog.csdn.net/qq_43562847/article/details/104283437
https://www.cnblogs.com/trust-freedom/p/6744948.html#paths_to_gc_roots

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

90、Neural Residual Radiance Fields for Streamably Free-Viewpoint Videos

简介 主页:https://aoliao12138.github.io/ReRF/ 前提知识:DeVRF:https://jia-wei-liu.github.io/DeVRF/ 先利用多台固定相机拍摄动态场景,在第一帧利用DVGO重建好半显示场景,后续则是通过预测体素x,y,z三个方向的运…

crontab -e 系统定时任务

crontab -e解释 crontab 是由 “cron” 和 “table” 两个单词组成的缩写。其中,“cron” 是一个在 Linux 和类 Unix 操作系统中用于定时执行任务的守护进程,而 “table” 则是指一个表格或者列表,因此 crontab 就是一个用于配置和管理定时任…

PHP 单笔转账到支付宝账户,支付宝公钥证书实现版本

支付宝某些业务只能使用公钥证书方式来验签 如:即使转账 红包等 笔者就要实现这样一个功能,【单笔转账到支付宝账户】,采用支付宝公钥证书签名来实现。 话不多说,流程先走起 第一步:下载支付宝秘钥生成器 由于我们使…

手把手教你 DVOL

分享本文在朋友圈的读者可获得本文数据和 Python 代码。留个言说已分享(不用截屏)我相信你,我会发给你百度盘下载链接。 本文长度为 6393 字,建议阅读 32 分钟 题图:SignalPlus Dashboard 0 引言 Deribit volatility (…

基于 VITA57.1 的 2 路 2GSPS/2.6GSPS/3GSPS 14bit AD 采集 FMC 子卡模块

板卡概述 FMC152 是一款基于 VITA57.1 标准的,实现 2 路 14-bit、2GSPS/2.6GSPS/3GSPS AD 采集 FMC 子卡模块。该模块可直接与 FPGA 载卡配合使用,板卡 ADC 器件采用 ADI 公司的 AD9208 芯片, 与 ADI 公司的 AD9689 可以实现 PIN 脚兼容。该…

URI URL URN定义

1 定义 URI:全称Uniform Resource Identitfier,也就是统一资源标识符,可以标识互联网上某一资源,用来标识抽象或物理资源的一个紧凑字符串。 URL:全称Uniform Resource Locator,统一资源定位符&#xff0c…

【hello Linux】进程程序替换

目录 1. 程序替换的原因 2. 程序替换原理 3. 替换函数 4. 函数解释 5. 命名理解 6.简陋版shell的制作 补充: Linux🌷 1. 程序替换的原因 进程自创建后只能执行该进程对应的程序代码,那么我们若想让该进程执行另一个“全新的程序”这 便要用…

JVM系列(八) JVM 垃圾收集算法

前面我们了解了很多JVM配置垃圾回收的方式,但是具体垃圾是如何被回收的,或者说垃圾回收算法有哪些?今天我们文章主要讲解一下垃圾回收算法 1.分代收集理论 我们都知道 很早的JVM会把堆分为几个区域,新生代,老年代&am…

pandas读取Excel核心源码剖析,面向过程仿openpyxl源码实现Excel数据加载

📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 今天我们将研究pandas如何使用openpyxl引擎读取xlsx格式的Excel的…

el-tabs嵌套el-upload使用

需求:1 .第一个标签展示固定字样,且不能删除,最少上传三张图片。 2. 其余标签双击可编辑字样,10字以内,可删除,均可上传图片。 3. 号按钮可点击添加标签,标签数量控制在10个以内。 4. 当标签下无…

一文学会VSCode代码同步至GitHub

一、上手GitHub 1. 了解GitHub 上手GItHub之前首先要了解一下GItHub的关键词,如下: (1) 仓库 (Repository) 仓库是用来存放项目代码,每一项目对应一个仓库。(2) 收藏 (Star) 收藏别人的仓库,方便自己查找。(3) 复制/克隆项目 (…

忆暖行动|“以前的住宿也没有这么好的环境,住的都是土房子,一下雨就哗哗掉墙皮”

常忆旧时苦 方思今日甜 新年将至,彩灯与烟火闪烁。值此佳节,我们去看望了一位65岁的退休教师,并与她进行了交谈,从奶奶的讲述中,我们了解到过去生活的不易,珍惜当下的美好生活。 迎接新年 为迎接新年&am…

base64、File、Blob、ArrayBuffer几种文件格式介绍以及互转

文章目录 关系介绍BlobFileFileReader二进制数组ArrayBuffer对象URL.createObjectURLbase64 转化file转base64blob转base64base64转blobbaes64转fileblob转fileblob转ArrayBufferfile转ArrayBuffer 关系 介绍 Blob 介绍 是一个不可变、原始数据的类文件对象本质上是js的对象 s…

后悔了怎么办 - undo日志

一、undo日志 概念: 把回滚时所需的东西都给记下来 二、事务id 给事务分配id的时机 (1)对于只读事务来说,只有在它第一次对某个用户创建的临时表执行增、删、改操作时才会为这个事务分配一 个 事务id ,否则的话是不…

4.3 转换与处理时间数据

4.3 转换与处理时间数据 4.3.1 转换字符串时间为标准时间1、Timestamp2、DatetimeIndex或者PeriodIndexDatetimeIndex与PeriodIndex函数及其参数说明 4.3.2 提取时间序列数据信息Timestamp类常用属性及说明 4.3.3 加减时间数据Timedelta类周期名称、对应单位及其说明 4.3.4 任务…

Java知识总结

https://www.bilibili.com/video/BV1ys4y1S7Lc 1、Java中线程的实现方式 为什么说本质上只有一种实现线程的方式?实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里? 实现 Runnable 接口 public class RunnableThread implements Runnable { O…

ai智能改写文案-ai同义转换

文案创作是现代广告营销中不可或缺的一环,一个好的文案不仅可以提升产品的购买率,还可以实现品牌等方面的推广。但是,文案的创作需要耗费大量的时间和精力,如果能够利用智能化技术进行改写,不仅可以大大缩短文案创作时…

JAVA内存不足导致频繁回收和swap引起的性能问题 故障重现(内存篇2)

背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡。 我按经验开始调优,在每个关键步骤…

本地安装directus

简介 Directus 是用于管理 SQL 数据库内容的实时 API 和 App 控制面板。 API会根据数据库模式/内容的实时更改动态更新(无需重新启动服务器)。 Directus安装在任何新的或现有的 SQL 数据库之上,提供 API 层(REST、GraphQL、JS-SD…

获取商品SKU信息API调用代码展示、请求参数和返回值说明

SKU是什么意思 最小存货单位(SKU),全称为stock keeping unit,即库存进出计量的基本单元,可以是以件、盒、托盘等为单位。SKU这是对于大型连锁超市DC(配送中心)物流管理的一个必要的方法。现在已…