【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消息队列,保存文章数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生不能接入数据,那还叫数字孪生吗?花架子而已

Hi,我是贝格前端工场,经常给大家分享可视化和数字孪生项目,就有一些老铁说这个不能接入真实数据,是个花架子。我就乐啦,不接入数据那还叫数字孪生吗? 数字孪生是指通过数字化技术对实体世界进行建模、仿真和…

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…

「 网络安全常用术语解读 」SBOM主流格式SWID详解

国际标准化组织(ISO)和国际电工委员会(International Electrotechnical Commission,IEC)发布了ISO/IEC 19770-2软件标识(Software Identification,SWID)标签标准,该标准定…

数据结构与算法---线性表

线性表 1.顺序表 需求分析 /*创建顺序表具体功能:初始化顺序表销毁顺序表获取顺序表元素个数输出顺序表中的内容自动扩容增 --- 插入数据(包含了尾部添加功能)删 --- 删除数据(包含了尾部删除功能)改 --- 修改数据查…

(ARM)ORACLE JDK 22 的下载安装及环境变量的配置

目录 获取JDK 安装JDK 配置JAVA环境变量 其他补充:JDK 22的新特征 1. 语法 2. 库 3. 性能 4. 工具 在今年的3月份,ORACLE 更新了的JDK 发行版 JDK 22,作为了一位ORACLE Primavera系列产品的研究者,其实对JDK的迭代完全不感…

基于.NET WinForms 数据的CURD实现

开发工具 VS 2022 C#,数据库MS SQL SERVER 2019 1.WinForms界面 2.使用SqlDataApater DataSet DataGridView 读取数据 private void ReadData() {//数据库连接串string strConn "Data Source127.0.0.1;Initial CatalogTEST;Persist Security InfoTrue;Us…

Vue 组件通信

组件通信 组件与组件之间的数据传递 组件的数据是独立的,无法直接访问其他组件的数据。通过组件通信,可以访问其他组件的数据。 组件关系 父子关系非父子关系 组件通信解决方案 父子关系 父->子 父组件通过props将数据传递给子组件 App.vue …

模式识别作业:颜色算子的三种阈值分割算法

一、引言: 在图像处理中,我们往往需要提取图像的一些关键信息,比如本篇文章的内容——提取颜色,然而当我们需要提取某一种颜色时,无论图像余下的部分如何“丰富多彩”,他们都不再重要,需要被忽…

IDEA2024版本控制台乱码怎么解决?

在使用最新版本的IDEA时,可能会遇到控制台输出乱码问题? 在网上找了很多办法,修改了IDEA的vmoptions文件也没有用,最后发现原来是要修改这里 Setting>>Build,Execution,Deployment>>Runnr中的VM Options配置&#xf…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本:20.11.1 pnpm版本:9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

2024年 Java 面试八股文——Mybatis篇

目录 1. 什么是Mybatis? 2. 说说Mybatis的优缺点 3. Xml映射文件中,都有哪些标签 4. #{}和&{}有什么区别 5. Mybatis是如何进行分页的,分页插件的原理是什么 6. Mybatis是如何将sql执行结果封装为目标对象并返回的? 7. Mybatis是怎…

【副本向】Lua副本逻辑

副本生命周期 OnCopySceneTick() 子线程每次心跳调用 --副本心跳 function x3323_OnCopySceneTick(elapse)if x3323_g_IsPlayerEnter 0 thenreturn; -- 如果没人进入,则函数直接返回endif x3323_g_GameOver 1 thenif x3323_g_EndTick > 0 thenx3323_CountDown…

简化Transformer模型,以更少的参数实现更快的训练速度

在深度学习领域,Transformer模型因其卓越的性能而广受欢迎,但其复杂的架构也带来了训练时间长和参数数量多的挑战。ETH Zurich的研究人员Bobby He和Thomas Hofmann在最新研究中提出了一种简化的Transformer模型,通过移除一些非必要的组件&…

STM32——GPIO篇

技术笔记! 1. 什么是GPIO? GPIO是通用输入输出端口(General-purpose input/output)的英文简写,是所有的微控制器必不可少的外设之一,可以由STM32直接驱动从而实现与外部设备通信、控制以及采集和捕获的功…

wordpress子比主题美化-为图文列表封面添加动态缩略图特效 多种效果演示

wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题加一个列表文章封面添加动态缩略图 直接复制以下代码,添加到主题自定义CSS代码中即可,下图为效果演示 wordpress子比主题-为图文列表文章封面添加动态缩略图特效 给自己子比主题…

MySQL①——数据库与表格的创建

今日任务: 创建一个名为“db_classes”的数据库 创建一行名为“db_hero”的表 将四大名著中的常见人物插入这个英雄表 数据库的创建与删除 create 命令(创建): create database 数据库名;#参数默认create database …

Spring MVC(上)

initApplicationEventMulticaster为上下文初始化 simpleApplicationEventMulticaster怎么处理广播事件的 refisterListeners注册监听器 finishBeanFactoryInitialization初始化非延迟bean 惰性初始化 dispatcherServlet的初始化 servletConfigPropertyValues创建propertyValues…

虚拟化技术 安装并配置ESXi服务器系统

安装并配置ESXi服务器系统 一、实验目的与要求 1.掌握创建VMware ESXi虚拟机 2.掌握安装VMware ESXi系统 3.掌握配置VMware ESXi系统的管理IP 4.掌握开启VMware ESXi的shell和ssh功能的方法 二、实验内容 1.安装VMware workstation 15或更高版本 2.创建VMware ESXi虚拟…

软件杯 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

分布式事务—> seata

分布式事务之Seata 一、什么是分布式事务? 分布式事务是一种特殊类型的事务,它涉及多个分布式系统中的节点,包括事务的参与者、支持事务的服务器、资源服务器以及事务管理器。 在分布式事务中,一次大型操作通常由多个小操作组成…