【JVM】内存调优——内存泄漏、内存溢出

news2024/11/21 2:25:10

内存调优

什么是内存泄漏、内存泄漏?

  1. 内存泄漏:在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收。
  2. 内存溢出:内存的使用量超过了Java虚拟机可以分配的上限,最终产生了内存溢出OutOfMemory的错误。

内存泄漏的原因?

  1. 持续的内存泄漏:内存泄漏持续发生,不可被回收同时不再使用的内存越来越多,就像滚雪球一样雪球越滚越大,最终内存被消耗完无法分配更多的内存去使用,导致内存溢出。
  2. 并发请求问题:用户通过发送请求向Java应用获取数据,正常情况下Java应用将数据返回之后,这部分数据就可以在内存中被释放掉。但是由于用户的并发请求量有可能很大,同时处理数据的时间很长,导致大量的数据存在于内存中,最终超过了内存的上限,导致内存溢出。

内存泄漏原因

代码中

  1. equals()和hashCode() 导致的内存泄漏。没有重写正确的这两个方法。在使用HashMap的场景下,如果使用这个类对象作为key,HashMap在判断Key是否已经存在时会使用这些方法,如果重写方式不正确,会导致相同的数据被保存多份。
  2. 内部类引用外部类。非静态的内部类默认会持有外部类,垃圾回收时无法回收外部类。使用静态内部类,或静态方法。
  3. ThreadLocal的使用。手动创建的线程会自动回收,线程池创建的线程不会自动回收。需要调用ThreadLocal中的remove方法清理对象。参考问题 ThreadLocal中为什么要使用弱引用。
  4. String的intern方法。把字符串加入字符串常量池。
  5. 通过静态字段保存对象。大量数据在静态变量中被长期引用,数据就不会释放。减少保存在静态变量中,若不再使用则必须删除或设置为null。单例模式中,尽量使用懒加载,而不是立即加载。@Lazy。Bean中不要长期存放大对象,如果是缓存,设置过期时间。
  6. 资源没有正常关闭。不一定出现内存泄漏,会导致close方法不被执行。Java7开始,申请资源放在try()里面可以用于自动关闭资源。

并发中

通过发送请求向Java应用获取数据,正常情况下数据返回后,即可释放数据。当并发量很大,同时处理数据的时间长,导致大量的数据存在于内存中,导致内存溢出。

内存泄漏的解决方案

  1. 发现问题,通过监控工具尽可能尽早地发现内存慢慢变大的现象。
  2. 诊断原因,通过分析内存快照或者在线分析方法调用过程,诊断问题产生的根源,定位到出现问题的源代码。MAT打开hprof文件。
  3. 修复源代码中的问题,如代码bug、技术方案不合理、业务设计不合理等等。
  4. 在测试环境验证问题是否已经解决,最后发布上线。
-XX:+HeapDumpOnOutOfMemoryError #OOM时打印内存快照
-XX:HeapDumpPath=D:\jvm\dump\test1.hprof
-XX:+HeapDumpBeforeFullGC  #可以在FullGC之前就生成内存快照

jmap -dump:live #命令导出内存快照
heapdump #arthas中

MAT内存泄漏检测的原理

支配树。

在这里插入图片描述

在这里插入图片描述

监控Java内存的常用工具

JDK自带的命令行工具:

jps 查看java进程,打印main方法所在类名和进程id

jmap 生成堆内存快照;打印类的直方图

第三方工具:

  1. VisualVM
  2. Arthas
  3. MAT 堆内存分析工具
  4. Prometheus + Grafana

在线定位

  1. Jmeter插件,gc插件。
  2. arthas stack命令在线定位步骤,可以定位类。
  3. btrace脚本,可以指定类,监控的方法。灵活性高。

内存溢出案例

  1. 分页查询文章接口:单个文章对象占用内存量较大。限制单词访问条数;不需要获取文章内容;高峰期对微服务限流保护。
  2. Mybatis:判断ids是否存在id的接口。foreach进行sql拼接时,会在内存中创建对象,占用空间。限制参数中最大的id个数;将id缓存到redis或内存缓存中,通过缓存校验。
  3. 导出大文件:excel文件导出如果使用POI的XSSFWorkbook,在大数据量下占用大量内存。使用poi的SXSSFWorkbook;hutool中BigExcelWriter;easy excel。
  4. ThreadLoacl:在拦截器中,ThreadLocal清理的代码被错误的放在postHandle中,如果接口发生了异常,这段代码不会调用到,这样就产生了内存泄漏,将其移动到afterCompletion就可以了。
  5. 文章内容审核接口:SpringBoot中@Async注解异步审核;生产者消费者模式队列持久化到数据库;mq消息队列,保存文章数据

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

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

相关文章

ARP欺骗使局域网内设备断网

一、实验准备 kali系统:可使用虚拟机软件模拟 kali虚拟机镜像链接:https://www.kali.org/get-kali/#kali-virtual-machines 注意虚拟机网络适配器采用桥接模式 局域网内存在指定断网的设备 二、实验步骤 打开kali系统命令行:ctrlaltt可快…

栈的表达式求值中的应用——逆波兰表达式求值+中缀表达式转后缀表达式

文章目录 1. 逆波兰表达式(后缀表达式)求值思路讲解AC代码 2. 中缀表达式转后缀表达式分析方法总结 3. 中缀表达式求值 1. 逆波兰表达式(后缀表达式)求值 链接: link 这道题目叫做逆波兰表达式求值,那什么是逆波兰表…

使用PyTorch从头实现Transformer

前言 本文使用Pytorch从头实现Transformer,原论文Attention is all you need paper,最佳解读博客,学习视频GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文,并对其进行了…

05月04日(周六)30场比赛前瞻

今日数据: 昨日复盘: 欧洲五大联赛指的是欧洲影响力及竞技水平排名前五的足球联赛,通常包括英格兰足球联赛(The Premier League)、西班牙足球甲级联赛(La Liga)、意大利足球甲级联赛&#xff0…

vue2人力资源项目3主页

主页权限验证 前置守卫开启进度条,后置守卫关闭进度条 import router from /router import nProgress from nprogress// 导入进度条(模板自带) import nprogress/nprogress.css// 导入进度条样式(模板自带) // 前置守…

java中对文件的基本操作

文件IO 文件IO。啥叫文件的IO? 他就是指:1.Input(输入)2.Output(输出)。 比如,我们的电脑可以从网络中下载文件,也可以通过网络上传文件等等很多的例子,都体现了输入和…

Xamarin.Android项目使用ConstraintLayout约束布局

Xamarin.AndroidX.ConstraintLayout Xamarin.Android.Support.Constraint.Layout Xamarin.AndroidX.ConstraintLayout.Solver Xamarin.AndroidX.DataBinding.ViewBinding Xamarin.AndroidX.Legacy.Support.Core.UI Xamarin.AndroidX.Lifecycle.LiveData ![在这里插入图片描述]…

android天气实战

页面绘制 问题1、下拉框需要背景为透明 我懒得写全部省份就写了5个所以不需要往下 图标准备 iconfont-阿里巴巴矢量图标库几坤年没来这了好怀念啊,图标库选择下雨的图标等 准备网络请求 0、API接口准备 api免费七日天气接口API 未来一周天气预报api (tianqiap…

SVM直观理解

https://tangshusen.me/2018/10/27/SVM/ https://www.bilibili.com/video/BV16T4y1y7qj/?spm_id_from333.337.search-card.all.click&vd_source8272bd48fee17396a4a1746c256ab0ae SVM是什么? 先来看看维基百科上对SVM的定义: 支持向量机(英语:su…

[BLE] Heart Rate Protocol - Sensor

写在前面 目前我从网上找到的有关BLE心率协议的博文内容良莠不齐,很难让人根据文章内容来全面理解心率服务;此外SIG网站上有关心率服务的文档比较多,内容比较碎,需要读者从多个文档中将需要的内容拼接起来,因此写下这…

【动态规划】路径问题|不同路径I|不同路径II|珠宝的最高价值|下降路径的最小和|最小路径和|

一、不同路径I 62. 不同路径 - 力扣(LeetCode) 💡细节: 1.多开一行和一列(跟一维数组多开一个位置一样),这样方便初始化 2.状态转移方程:注意走一步并不是多一种走的路径&#xff0…

在编程的世界里,我相信每一行代码都是一次对未来的投资

😀前言 突然有感而发也是激励自己互勉 🏠个人主页:尘觉主页 文章目录 在编程的世界里,我相信每一行代码都是一次对未来的投资类似句子编程的本质代码的价值构建可持续的未来结语 在编程的世界里,我相信每一行代码都是一…

数据库基础--MySQL多表查询之外键约束

MySQL多表关系 一对一 顾名思义即一个对应一个的关系,例如身份证号对于每个人来说都是唯一的,即个人信息表与身份证号信息表是一对一的关系。车辆信息表与车牌信息表也是属于一对一的关系。 一对多 即一个表当中的一个字段信息,对应另一张…

【数据库原理及应用】期末复习汇总高校期末真题试卷02

试卷 一、填空题 数据库系统是指计算机系统中引入数据库后的系统,一般由数据库、________、应用系统、数据库管理员和用户构成。当数据库的存储结构发生了改变,由数据库管理员对________映象作相应改变,可以使________保持不变,…

vue快速入门(五十一)历史模式

注释很详细,直接上代码 上一篇 新增内容 历史模式配置方法 默认哈希模式,历史模式与哈希模式在表层的区别是是否有/#/ 其他差异暂不深究 源码 //导入所需模块 import Vue from "vue"; import VueRouter from "vue-router"; import m…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月,一款叫Stable Diffusion的AI绘画软件开源发布,从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人,已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

华为eNSP小型园区网络配置(上)

→跟着大佬学习的b站直通车← 目标1:dhcp分配ip地址 目标2:内网用户访问www.yzy.com sw1 # vlan batch 10 # interface Ethernet0/0/1port link-type accessport default vlan 10 # interface Ethernet0/0/2port link-type trunkport trunk allow-pass…

oracle pl/sql 如何让sql windows 显示行号

oracle pl/sql 如何让sql windows 显示行号 下载最新版的pl/sql第一步,在preferences中对sql Windows进行设置,如下所示第二步,在preferences中对User interface进行设置,如下所示结果如下当然,还可以通过右键选择是否…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙,是一个门,用于保护服务器安全的。 防火墙可以保护服务器的安全,还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用,入侵者必须穿透防火墙的安全防护…

【大模型学习】私有大模型部署(基础知识)

私有大模型 优点 保护内部隐私 缺点 成本昂贵 难以共享 难以更新 大模型底座 基础知识点 知识库 知识库是什么? 知识库的作用是什么? 微调 增强大模型的推理能力 AI Agent 代理,与内部大模型进行交互 开源 and 闭源 是否可以查…