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

内存调优

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

  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.mzph.cn/bicheng/6215.shtml

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

相关文章

如何让 PDF 书签从杂乱无序整洁到明丽清新

1、拉取书签(详细步骤看文末扩展阅读) 原状态 —— 杂乱无序 自动整理后的状态 —— 错落有致,但摩肩接踵 2、开始整理 全选自动整理后的书签,剪切 访问中英混排排版优化 - 油条工具箱 https://utils.fun/cn-en 1 粘贴 → 2 …

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8、redis(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便,不影响系统整体,和前面虚拟环境有异曲同工之妙,今天把老笔记本T400拿出来装了个ubuntu24…

Covalent Network(CQT)为 Arbitrum 生态提供 250 万美元的资助,以促进 Web3 的创新与发展

Covalent Network(CQT)作为 Web3 领先的“数据可用性”层,宣布将提供 250 万美元的资金以支持 Arbitrum 生态项目,包括 Arbitrum One、Nova、Orbit 或 Stylus。此举旨在通过提供资源和帮助,推动利用 Arbitrum 网络上 C…

【JVM】JMM 内存模型

JMM 概述 内存模型 java[内存模型](Java Memory Model) 和 [内存结构]JMM规定了在多线程下对共享数据的读写时,对数据的原子性 有序性 可见性的规则和保障。 原子性 原子性问题: i和i–不是原子性操作! 所以一个i指令会在执行过程中被另一个线程执行! 问题分…

牛客美团2024年春招第一场笔试【技术】解题

1.小美的平衡矩阵 小美拿到了一个n∗n的矩阵,其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在,小美希望你回答有多少个i∗i的完美矩形区域。你需要回答1≤i≤n的所有答案 输出…

VSCode连接远程服务器时卡在审核(check)log.txt和pid.txt

诸神缄默不语-个人CSDN博文目录 VSCode就NM跟SB一样天天搁那儿更新,瞎JB更新,每次更新都要出一次兼容性问题,远程服务器不能连公网就上不去了,也没有显式提示,错误很明显就是在下载不了文件,用VSCode内置的…

Linux的有关权限的学习

1.认识权限在Linux中的表示 在Linux中,一切皆文件,而每个文件都会有其相对应的操作权限。那么,我们该怎么来认识他们呢? 首先我们可以看到,在每个test文件的前面都会有一个-rw-r--r--这个字符,而这个字符&…

ServiceNow 研究:通过RAG减少结构化输出中的幻觉

论文地址:https://arxiv.org/pdf/2404.08189 原文地址:rag-hallucination-structure-research-by-servicenow 在灾难性遗忘和模型漂移中,幻觉仍然是一个挑战。 2024 年 4 月 18 日 灾难性遗忘: 这是在序列学习或连续学习环境中出现…

Pycharm远程环境开发(保姆级详细步骤)

使用远程机器的python环境 同步一下linxu和window的文件 可以从远端下载到本地(如下图所示),也可以从本地上传到linux,在左侧的目录里右键选择你所需要的上传文件点击deployment然后upload就行

k8s 资源组版本支持列表

1 kubernetes的资源注册表 kube-apiserver组件启动后的第一件事情是将Kubernetes所支持的资源注册到Scheme资源注册表中,这样后面启动的逻辑才能够从Scheme资源注册表中拿到资源信息并启动和运行API服务。 kube-apiserver资源注册分为两步:第1步,初始化Scheme资源注册表;…

Linux进程——Linux下常见的进程状态

前言:在进程学习这一块,我们主要学习的就是PCB这个进程控制块,而PBC就是用来描述进程的结构体,而进程状态就是PCB结构体中的一个变量。 本篇主要内容: 操作系统中的进程状态Linux下的进程状态 在开始之前,我…

AI学习指南-人工智能概述

欢迎来到人工智能的奇妙世界!如果你是初学者,那么你来对地方了。今天,我们将一起探索人工智能(AI)的基本概念,看看它是如何分类的,它的应用有哪些,以及未来可能的发展方向。准备好了…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

Java项目:基于SSM框架实现的在线医疗服务系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的在线医疗服务系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

MES(制造执行系统)与PDCA循环,斩不断理还乱的关系。

MES系统算是B端系统中比较复杂的一种&#xff0c;这与我国制造业标准化程度较低有一定的关联&#xff0c;MES的存在就是要更好执行PDCA循环&#xff0c;二者关联是千丝万缕的&#xff0c;B系统提升专家借此为大家分享一下。 一、什么是PDCA PDCA&#xff08;Plan-Do-Check-Ac…

【系统架构师】-选择题(十一)

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

SQLite如何处理CSV 虚拟表(三十七)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite的DBSTAT 虚拟表&#xff08;三十六&#xff09; 下一篇:SQLite的扩展函数Carray()表值函数(三十八) ​ RFC4180格式是一种文本文件格式&#xff0c;被用于表格数据间的交互&#xff0c;也可将表格数据转化…

项目管理-项目范围管理1/2

1.项目范围管理-知识框架 2.范围管理-6个过程 项目范围管理&#xff0c;过程 6个&#xff0c;包括“规收定 创确控”&#xff1a; 规划范围管理收集需求定义范围创建WBS确认范围控制范围 2.1规划范围管理 &#xff08;1&#xff09;主要内容 4-3-2 &#xff08;2&#xf…

如何低成本创建个人网站?

目录 前言 网站源代码 虚拟主机或服务器 域名注册或免费二级域名 域名解析 上传源代码压缩包 添加刚刚的域名 成功搭建 失败的解决方案 结语 前言 很多小白都非常想拥有自己的网站&#xff0c;但很多人虽然有了自己的源代码但苦于不知道怎么将其变成所有人都能够访…

Lucene从入门到精通

**************************************************************************************************************************************************************************** 1、概述 【1】入门&#xff1a;作用、有点与缺点 【2】应用&#xff1a;索引、搜索、fie…