内存泄漏分析及规避方法

news2024/11/24 11:09:49

啥是内存泄漏?

内存泄漏就是堆内存中的某些对象,你虽然不再使用它们了,但是垃圾回收器还回收不了他们,长此以往内存就慢慢耗没了。

内存泄漏怎么检测?

如果你的服务经常占用内存很大,慢慢隔一段时间需要重启一下,说明代码有问题,存在内存泄漏的风险,具体的可以使用三种方式检测:

  1. Heap Memory footprint

  1. Garbage collector activity

  1. heap dump log

内存泄漏实例

此处存在死循环,无法跳出,同时list的内存占用不断增大,无法得到释放,导致OOM

  1. VisualVM是用于分析堆内存占用情况的

从图中就可以看出,堆内存很快就被打满了。

  1. 垃圾回收活动分析

从图中可以看出,垃圾回收还是很频繁的,但是内存仍然很快被打满了,这说明出现了内存泄漏。

  1. Heap Dump Log是可以在启动的时候配置的:

+XX:+HeapDumpOnOutOfMemoryError表示开启日志

-XX:HeadpDumpPath用于指定日志文件的存储路径

通过分析Dump日志,我们发现存在大量的对象,他们的类型都是Person

然后看对象的详细数据,发现他们都被一个ArrayList占用着

这样就可以锁定出现问题的位置了。

解决内存泄漏

这里使用i作为计数器,每创建1000个Person对象,就会把ArrayList重置一下,这样,上一轮的1000个对象就不在被引用,垃圾回收器就可以正常回收这些对象了。

经过改造,我们发现内存的占用量忽高忽低,这说明垃圾回收起到了作用,内存泄漏的问题解决了。

cpu和垃圾回收活动占用都不高,说明内存泄露解决了。

如何避免内存泄露?

  1. 大对象尽可能复用

  1. 不创建无用的对象

  1. 无用的对象及时置空

  1. 对于网络、数据库、文件、流等资源,open以后一定要close,防止内存泄露。可以使用try...finally句式,或者try with resource模式

  1. 字符串的频繁拼接时,注意使用StringBuilder进行替换,因为每次拼接都会产生新的对象,然后存储在字符串常量池,而字符串常量池被分配在对内存中,可能导致堆溢出。

  1. 尽可能使用基础类型,避免使用包装类型。包装类型都维护在堆内存中,创建和使用都不如基础类型方便。

  1. 不推荐使用静态集合

一方面内存占用不可控,另外资源难以回收,因为对象一直被占用着。

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

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

相关文章

Linux学习第十三节-软件包

1.分类 二进制包 rpm包 2.软件包管理 软件包之间的依赖关系 命令格式:rpm [选项] 软件包 常用选项: -q #仅查询软件是否安装 -qa #列出所有已经安装在系统中所有软件,可以和grep过滤指定的软件包 -qi #列出软件包详细信息&#xff0c…

xxl-job启用https访问

一、准备证书 1.进入想要生成证书的目录 2.在路径中输入cmd,点击回车 (1) (2) 3.输入命令keytool -genkeypair -alias "boot" -keyalg "RSA" -keystore "seek.keystore" 4.输入信息&#xff0c…

12_MySQL数据类型

1. MySQL中的数据类型常见数据类型的属性,如下:2. 整数类型2.1 类型介绍整数类型一共有 5 种,包括 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。它们的区别如下表所示:2.2 可选属性2.2.1:MM : 表…

【Spring 深入学习】事务的理解以及配置

事务的理解以及配置 1. 概述 1.1 什么是事务 事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位,由D…

springboot之自动配置

文章目录前言一、配置文件及自动配置原理1、配置文件2、yaml1、注解注入方式给属性赋值2、yaml给实体类赋值3、Properties给属性赋值二、springboot的多环境配置四、自动配置总结前言 1、自动装配原理 2、多种方式给属性赋值 3、多环境配置 4、自动配置 一、配置文件及自动配置…

2022年数维杯国际大学生数学建模挑战赛A题自动地震地平线跟踪解题全过程论文及程序

2022年数维杯国际大学生数学建模挑战赛 A题 自动地震地平线跟踪 原题再现: 随着我国经济社会发展,地质工作的重要性也日益提高。地震资料解释是地震勘探工程的一个重要阶段,可以明确油气勘探的地下构造特征,为油气勘探提供良好和…

【NLP相关】attention的代码实现

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

英飞凌Tricore实战系列导读

本文框架 1.系列概述1.1 外设理论及应用介绍1.2 基于TC3xx的MCAL各外设配置开发1.3 基于TC3xx的Davinci工程开发1.4 项目中问题排查经验分享1.5 其他相关话题分享2. 目前已发布系列文章汇总1.系列概述 英飞凌TC3xx以其强大的性能,扩展性,存储及安全性能在汽车电子中扮演着越…

0.基于知识图谱的知识建模详细方案

0.前言 知识图谱以结构化的形式描述客观世界中概念、实体及其关系。实体是客观世界中的事物,概念是对具有相同属性的事物的概括和抽象。本体是知识图谱的知识表示基础,可以形式化表示为,O={C,H, P,A,I},C 为概念集合,如事物性概念和事件类概念,H是概念的上下位关系集…

基于高灵敏度可编程线性霍尔传感器的液压缸位移检测装置(位移传感器)

目前国内工业自动化水平不断提高,工程机械、机床设备等面向自动化的同时,对控制系统的精度要求也越来越严格。在所有使用到液压的机械和设备中,液压缸是必不可少的部件,并且承载着重要的液压转换功能。而液压缸的位移检测在精确控…

Hexo+live2d | 如何把live2d老婆放进自己的博客

参考:Hexo添加Live2D看板娘最新教程live2d-widgetlive2d-widget-models网页/博客Hexo添加live2d游戏角色看板娘,简易添加,碧蓝航线等live2d新型游戏角色模型(moc3)live2d-moc3jsdelivr方法1可以直接去看参考文章的第一部分的第一篇…

【LeetCode】剑指 Offer 22. 链表中倒数第k个节点 p136 -- Java Version

题目链接:https://leetcode.cn/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 1. 题目介绍(22. 链表中倒数第k个节点) 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数&…

C语言-基础了解-21-C输入/输出

C输入/输出 一、标准文件 C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕 文件指针是访问文件的方式,本节将讲解如何从键盘上读取值以及…

葫芦娃自动化平台-appium实战

一、配置jar包 右键用压缩工具打开jar 修改application.yml文件 name: test666 改为自己名字 libPath、drivenPath:改成自己电脑已有路径 修改appium.properties 文件,方式和上面一样 #APP名称 注意带apk后续 例:test.apk 此文件请放置在项目根目录下 …

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required 问题处理

错误日志: 解决办法: 1.查看配置文件是否正确 # MyBatis-plus配置 mybatis-plus:# 配置Mapper.xml映射文件mapper-locations: classpath*:/mapper/*Mapper.xml# 配置MyBatis数据返回类型别名(默认别名是类名)type-aliases-packa…

POSTGRESQL SQL 语句案例,一场由LIMIT 1 引发的“奇怪异像”

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群。最近一段工作…

JS 数组拍平(多种方法)

前言数组拍平(扁平化数组)是面试中常考查的知识点,之前发过一篇基础版的数组拍平 传送门通过之后的学习,又了解了一些其他的数组拍平的操作,详情请看下面的文章flatflat 方法可以直接用于数组拍平,不传入参…

Elasticsearch集群搭建、优化及实践

文章目录一、Elasticsearch集群1、Elasticsearch集群概念2、Elasticsearch集群安装3、安装Kibana4、测试集群状态二、Elasticsearch优化1、磁盘选择2、分片策略3、内存设置三、Elasticsearch实践1、ES自动补全2、创建索引3、安装logstash导入数据4、项目搭建5、自动补全功能6、…

nginx七大核心应用场景详解 解决生产中的实际问题 二次开发扩展

nginx七大核心应用场景详解 & 解决生产中的实际问题1、nginx的安装与简单配置1.1、环境准备1.2、nginx基本操作指令:1.3、安装成系统服务1.4、conf 配置文件说明2、虚拟主机2.1、nginx多主机配置2.2、二级域名与短网址解析3、基于反向代理的负载均衡3.1、跳转到…

【Mysql索引】五种索引类型

目录前期准备实操实战主键索引 primary唯一索引 unique执行效果普通索引 noraml执行效果全文索引 fulltext执行效果组合索引执行效果前期准备 创建一个表,如果有测试的表也可以用(把主键id设置为自增)如果给字段添加的值有中文,需…