【诊断】linux系统下的内存溢出问题定位

步骤:

        (1)编写并运行一个会造成内存溢出的代码

import java.util.HashMap;
import java.util.concurrent.atomic.AtomicInteger;

public class HeapLeakTest {

    static AtomicInteger i = new AtomicInteger(1);

    public static void main(String[] args) {

        HashMap<String, Integer> map = new HashMap<>();
        while (true) {

            map.put(new String("第" + i.get() + "个对象"), i.get());
            i.incrementAndGet();
        }
    }
}

        在死循环中不断创建String对象和Integer对象,map不能及时释放无用对象的内存资源,模拟内存溢出。

        (2)使用top命令查看所有进程使用系统资源的情况

        可以看到9180进程(Java程序)CPU占用率异常。

        (3)使用top -H -p 9180查看进程下每一个线程使用CPU的情况

        可以看到9182、9183、9184、9185、9186、9187、9188、9189等线程的CPU占用率异常。

        (4)通过jstack 9180 > log.txt命令将Java程序的堆栈信息打印到log.txt中,使用cat log.txt | grep 0x23df(线程id的十六进制形式)过滤出异常线程的信息

        我们可以看到,这些CPU使用率异常的线程都是GC线程,那么CPU使用率异常问题的产生原因肯定在堆内存中了。

        (5)通过jstat -gcutil 9180 2000 10命令查看实时堆内存使用情况

        其中FGC(Full GC)次数最高达到137次,FGCT(Full GC Time)总时间为67s,每次Full GC耗时:67 / 137 ≈ 0.5s。要知道Full GC是会stop the world(暂停其它用户线程的运行)的,Java进程绝大部分时间都用于GC就没有时间去做其他事了。

        (6)使用jmap -histo 9180命令,查看哪些类对象占用内存较多

        这里截取了占用内存资源的TOP10([C指char数组,String底层是char数组),我们发现主要是new了大部分的String对象、Integer对象存储在HashMap中,又没有即时清理HashMap中的无用数据导致内存溢出。

总结:

        1、通过top命令定位异常进程(pid)。

        2、通过top -H -p pid命令查看异常进程下,线程CPU使用率情况。

        3、通过jstack pid > log.txt命令,将线程的堆栈信息打印到log.txt文件中。

        4、通过cat log.txt | grep tid(thread id) -A 20命令,过滤出异常线程的相关信息。

        5、通过jstat -gcutil pid 2000 10命令,查看堆内存使用情况。

        6、通过jmap -histo pid命令,查看占用内存资源较多的类对象有哪些。

        基本上到了第6步你就可以知道哪些类对象导致了内存溢出,再去review代码修改bug即可。

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

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

相关文章

202. 快乐数(快慢指针)

对于任意n&#xff0c;可能出现以下几种情况&#xff1a; 最终会得到 1。 最终会进入循环。 值会越来越大&#xff0c;最后接近无穷大。 对于第三种情况&#xff0c;我们可以简单的列举一下&#xff1a; 会发现&#xff0c;13位数字的数位平方和最大是1053&#xff0c;1…

LeetCode刷题--- 子集

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题【 http://t.csdnimg.cn/yUl2I 】【C】 【 http://t.csdnimg.cn/6AbpV 】数据结构与算法【 http://t.csdnimg.cn/hKh2l 】 前言&#xff1a;这个专栏主要讲…

多对多关系通用操作组件,省时省力的神器

项目上有很多对多操作的场景&#xff0c;建对象&#xff0c;建mapper接口&#xff0c;设置查询条件&#xff0c;查询多对多数据等都是一项极为耗时耗力的工作。因此&#xff0c;搓了这款集建表-保存-查询-设置条件等操作于一体的组件。原理简单&#xff0c;利用$标签动态作些操…

25.BFD双向转发检查

BFD双向转发检查 链路故障检测工具&#xff0c;结合三层协议使故障检测更加快速 例如两台路由器之间加了一台二层设备 在修改优先级后&#xff0c;默认选择了下面那条优先级高的路由&#xff0c;R1 ping R2的时候是正常能ping通的 但是&#xff0c;当下面的路由出现故障后&a…

基于SpringBoot实现的社区人员管理系统

一、系统架构 前端&#xff1a;html | js | css | layui 后端&#xff1a;springboot | mybaits-plus | shiro 环境&#xff1a;jdk1.8 | mysql8 | maven 二、代码及数据库 三、功能介绍 01. 登录 02. 首页 03. 常规管理-住户模块-住户管理 04. 常规管理-住户模块-高危…

DevEco Studio Preview失败

安装DevEco Studio新建第一个项目后&#xff0c;点击Previewer预览失败&#xff0c;Preview failed Unable to start the previewer. Open PreviewerLog to check for details。 点击File->Settings->Build, Execution, Deployment->Build Tools->Hvigor&#xff…

音视频直播核心技术介绍

直播流程 采集&#xff1a; 是视频直播开始的第一个环节&#xff0c;用户可以通过不同的终端采集视频&#xff0c;比如 iOS、Android、Mac、Windows 等。 前处理&#xff1a;主要就是美颜美型技术&#xff0c;以及还有加水印、模糊、去噪、滤镜等图像处理技术等等。 编码&#…

任意文件下载漏洞的利用思考

0x01 前言 任意文件下载漏洞作为最常见的WEB漏洞之一&#xff0c;在平常的渗透测试中经常遇到&#xff0c;但是很多人却并没有深入去想该如何利用这种漏洞&#xff0c;导致忽略了一些细节的信息。 0x02 传统利用 1&#xff09; 下载配置文件连数据库 通过任意文件下载漏洞下载网…

翻译: LLMs关于人工智能的担忧 Concerns about AI

在短时间内&#xff0c;获取生成人工智能的能力已经在全球范围内传播&#xff0c;使许多人能够生成高质量的文章、图片和音频。随着这些惊人的能力的出现&#xff0c;也带来了许多关于人工智能的担忧。我认为即使在生成人工智能兴起之前&#xff0c;我们就已经生活在许多焦虑之…

charles和谷歌浏览器在Mac上进行软件安装,桌面上会显示一个虚拟磁盘,关掉页面推出磁盘内容都消失掉了 需要再次安装问题解决

其他软件也会有这种情况&#xff0c;这里我们以charles为例。绿色背景的内容是重点步骤。 1.如图&#xff0c;我下载了一个charles一个版本的dmg文件。 2.打开后&#xff0c;选择Agree 3.桌面会出现一个磁盘和如下页面 4.错误操作------可以不看 直接看第5步正确操作 常规情…

为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?

1、什么是梯度消失&#xff08;gradient vanishing&#xff09;&#xff1f; 参数更新过小&#xff0c;在每次更新时几乎不会移动&#xff0c;导致模型无法学习。 2、什么是梯度爆炸&#xff08;gradient exploding&#xff09;&#xff1f; 参数更新过小大&#xff0c;破坏了…

亚马逊、沃尔玛、eBay:通过优化测评策略,提高店铺排名的秘诀

目前&#xff0c;亚马逊平台不仅考虑产品和店铺的排名&#xff0c;还会对产品列表进行排名。不同的排名有不同的影响因素。以下是亚马逊影响商品详情页排名的因素&#xff1a; 1.销售排行&#xff1a;卖家可以通过查看BSR榜单来了解自己的销售排名。销售排名反映了你的产品的销…

第二天使用seleninum创建创建员工

上一篇我们已经登录进了系统,下面看下怎么自动创建用户信息。 一:知识准备 创建用户前,我们学习下seleninum的页面元素获取和填写数据方法 send_keys 发送数据 find_element_by_xpath 通过xpath定位,这个上一节我们说过 二:查看页面结构 进入系统以后,我们要做的…

27.BGP边界网关路由协议

BGP边界网关路由协议 外部网关路由协议 ospf能承载的路由条目有限 用在运营商与运营商之间&#xff0c;国与国之间 BGP运行在IGP之上&#xff08;内部网关路由&#xff09; IGP都是在物理链路上直连的基础之上才能建立邻居关系&#xff0c;BGP可以跨路由器建立邻居关系&…

做一个类似东郊到家系统需要哪些功能?

随着移动互联网的普及&#xff0c;越来越多的人开始通过手机预约按摩服务。按摩预约小程序&#xff0c;作为一种方便快捷的预约方式&#xff0c;让用户可以随时随地预约按摩服务。那么&#xff0c;按摩预约小程序的开发周期是多长呢&#xff1f;它又有哪些功能呢&#xff1f;本…

死锁产生的条件是什么???如何进行死锁判断???

死锁是指两个或多个线程相互等待对方释放所持有的资源&#xff0c;导致程序无法继续执行的情况。死锁产生的条件是&#xff1a; 互斥条件&#xff1a;至少有一个资源必须处于非分享状态&#xff0c;即一次只能被一个线程占用。占有且等待条件&#xff1a;线程持有至少一个资源…

【QML】QML复制文件或文件夹,显示进度,多线程复制

1. 效果 可以显示复制文件和文件夹的进度 复制文件&#xff1a; bool copyFileFunc(QString _from, QString _to);复制文件夹&#xff1a;bool copyDirectoryFiles(const QString &_from, const QString &_to);举例&#xff1a; //复制文件copyhelper.copyFileToDir(&…

手机技巧:手机膜种类介绍,你真的了解吗

目录 一、材质分类 水凝膜 钢化玻璃膜 二、功能分类 抗蓝光膜 防窥膜 磨砂膜 三、最后 鉴于智能手机越来越“娇贵”的体质&#xff0c;能让手机“裸奔”的大神相信不在多数。 然而比较注重手机保养的朋友都会选择给手机贴膜&#xff0c;这样能防止手机刮划&#xff0c;…

数据结构--图(更新ing~)

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…

Java:语法速通

参考 菜鸟教程 java 继承 class 父类 { }class 子类 extends 父类 { }继承的特性&#xff1a; 子类拥有父类非private的属性和方法子类可以对父类进行扩展子类可以重写父类的方法使用extends只能单继承&#xff0c;使用implements可以变相的多继承&#xff0c;即一个类继承…