项目实战典型案例20——内存长期占用导致系统慢

news2024/11/6 3:06:40

内存长期占用导致系统慢

  • 一:背景介绍
    • 出现的问题
    • 二:思路&方案
      • 下面是对于这三个原因的解决方案
        • 1.服务启动时分配的堆内存过小
        • 2. 具有大量大对象被创建,并且没有及时被GC回收或者由于具有引用GC无法回收
        • 3.当GC之后,虽然会清理堆内的对象看,但是并不会释放内存,没有把曾经申请到的内存归还给操作系统
  • 四:总结
  • 五:升华

一:背景介绍

本篇博客是对生产环境出现内存长期占用系统慢的分析以及总结。目的是将经历转变为自己的经验。通过博客的方式分享给大家,大家一起共同进步和提高。

出现的问题

目前又出现了爬取加载慢的情况,核心服务的内存占用很高的情况。
在这里插入图片描述
在这里插入图片描述

二:思路&方案

服务内存占用过高的原因:

  1. 服务启动时分配的堆内存过小(与Xms和Xmx有关,-Xms 为JVM启动时申请的初始Heap值,-Xmx 为JVM运行时可申请的最大Heap值)
  2. 具有大量大对象被创建,并且没有及时被GC回收或者由于具有引用GC无法回收(代码中存在不合理的地方,需要进行代码调优)
  3. 当GC之后,虽然会清理堆内的对象看,但是并不会释放内存,没有把曾经申请到的内存归还给操作系统(与垃圾回收器和垃圾回收器的回收机制有关)

下面是对于这三个原因的解决方案

1.服务启动时分配的堆内存过小

我们可以通过在启动jar文件的时候进行Xms和Xmx的配置
如:nohup java -Xms3072m -Xmx4096m -jar a.jar&

-Xms 为JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation来指定这个比列。

-Xmx 为JVM运行时可申请的最大Heap值,默认值为物理内存的1/4但小于1G,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRation来指定这个比列。
在这里插入图片描述

nohup 不挂断的运行
& 指后台运行

2. 具有大量大对象被创建,并且没有及时被GC回收或者由于具有引用GC无法回收

这类问题是由于代码存在不合理的情况,需要进行代码调优。我们可以分析dump文件找到内存占用的原因。
首先生成系统快照dump文件:
执行命令:

jmap -dump:[live,]format=b,file=<filename> <pid>

通过-dump选项,把java堆中的对象dump到本地文件,pid为进程号

然后通过内存分析工具进行分析:如MAT jvisual

示例: 使用jvisual分析dump文件,这个是jdk1.8自带的分析工具
在这里插入图片描述
启动jvisual载入下载下来的.hprof文件,之后就可以进行内存分析了。
在这里插入图片描述

3.当GC之后,虽然会清理堆内的对象看,但是并不会释放内存,没有把曾经申请到的内存归还给操作系统

这个主要与垃圾回收器垃圾回收器的回收机制有关

首先jvm明确目前使用的是哪一种垃圾回收器

cmd中输入以下命令:

java -XX:+PrintCommandLineFlags -version

在这里插入图片描述
虚拟机运行在Server模式下的默认值,打开此开关后,使用ParallelSeavenge+ParallelOld的收集器组合进行内存回收。
JDK1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)

目前已有的结论是full gc操作之后物理内存没有下降的原因与垃圾回收器回收的物理内存归还机制有关。
目前了解到1.CMS垃圾回收器,在内存开辟后,会随着System.gc()执行次数逐渐增多和回收频率逐渐拉长,从继续开辟内存到慢慢归还物理内存给操作系统,直到出现一次全部归还,就会在每次调用System.gc()都归还所有剩余的物理内存给操作系统;G1恰恰相反,G1是在JVM每次回收垃圾后,主动归还物理内存给操作系统,不做任何保留,大大降低了内存占用。
2.咱们目前使用的垃圾回收器的是ParallelSeavenge+ParallelOld
3.可以通过修改配置的方式更换垃圾回收器,如更换为G1
下一步的计划是了解ParallelSeavenge+ParallelOld物理内存归还机制.
选择更适合系统的垃圾回收器。

四:总结

由于出现内存长期占用导致系统慢这个问题是很早之前出现,现在进行复现比较困难。所以采取的是对于可能出现情况的一个分析,并没有深入的分析原因。

通过这次的分析,对于有与代码质量的原因造成的内存飙升问题,一方面可以通过代码质量进行解决,另一方面也可以通过压力测试的方式进行测试,避免由于代码原因导致内存飙升,并且居高不下。

另一方面,关于垃圾回收器的选择需要结合到实际情况进行选择

五:升华

博客中相当一部分内容是之间自己处理内存飙升和内存泄露的总结笔记。但是但是并没有进行及时总结导致还是缺很多东西。及时总结还真是一个事。进行及时总结,1+n,n+1。

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

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

相关文章

再获认可!腾讯安全NDR获Forrester权威推荐

近日&#xff0c;国际权威研究机构Forrester发布最新研究报告《The Network Analysis And Visibility Landscape, Q1 2023》&#xff08;以下简称“NAV报告”&#xff09;&#xff0c;从网络分析和可视化&#xff08;NAV&#xff09;厂商规模、产品功能、市场占有率及重点案例等…

LeetCode刷题——回溯法

文章目录[中等]全排列[中等]全排列 II[中等]组合总和[中等]组合总和 II[中等]复原 IP 地址[中等]括号生成[中等]子集[中等]单词搜索[中等]组合[中等]全排列 原题链接题解 class Solution { public:vector<vector<int>> ans;vector<int> num;int flag[10];v…

三天吃透消息队列面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

OSPF路由协议总结

OSPF路由协议总结一 OSPF协议的三个工作步骤二 5中OSPF协议报文三 4种网络类型&#xff0c;邻居和邻接3.1 P2P3.2 P2MP3.3 Broadcase3.4 NBMA&#xff08;非广播多路访问&#xff09;四 OSPF协议的度量方式五 LS&#xff08;链路状态&#xff09; LSA&#xff08;链路状态通告&…

JMU软件20 大数据技术复习(只写了对比18提纲的变动部分)

原博主 博客主页&#xff1a;https://xiaojujiang.blog.csdn.net/ 原博客链接&#xff1a;https://blog.csdn.net/qq_43058685/article/details/117883940 本复习提纲只适用于JMU软件工程大数据课程&#xff08;ckm授课&#xff09; 具体内容参考老师提纲的考纲&#xff0c;18和…

使用Tensorflow完成一个简单的手写数字识别

Tensorflow中文手册 介绍TensorFlow_w3cschool 模型结构图&#xff1a; 首先明确模型的输入及输出&#xff08;先不考虑batch&#xff09; 输入&#xff1a;一张手写数字图&#xff08;28x28x1像素矩阵&#xff09; 1是通道数 输出&#xff1a;预测的数字&#xff08;1x10的one…

100种思维模型之信息传递思维模型-028

人与人之间存有 认知偏差和理解偏差 &#xff0c;信息在传递过程中会 衰减、失真以及再加工 &#xff01; 信息传递思维模型 &#xff0c;一个有助于 提高信息传递质量 的思维模型。下面从三个方面进行介绍&#xff0c; 何谓信息传递思维模型、信息传递思模型生活中的运…

JVM系统优化实践(9):G1垃圾回收器

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;在JDK8及其之前&#xff0c;一直用的都是ParNewCMS的组合&#xff1a;ParNew负责年轻代的垃圾回收&#xff0c;而由CMS负责老年代的垃圾回收&#xff0c;但会产生…

脑机接口科普0016——独立BCI与非独立BCI

本文禁止转载&#xff01;&#xff01;&#xff01;&#xff01; 所谓的“独立BCI”与“非独立BCI”仅仅是BCI系统中的一个术语。本章主要是介绍一下这两个术语。 这两个术语是由Wolpaw在2002年提出来的。 独立BCI是指不依赖于中枢神经系统的的输出。 非独立BCI是指那种依赖…

工作5年了,你竟然还不会应用优雅停机?

事情是这样的&#xff0c;小明是一个工作五年的老程序员&#xff0c;半秃着的头已经彰显了他深不可测的技术实力。 这一天&#xff0c;小明收到了领导给过来的一个需求。 领导对小明说&#xff1a;“小明啊&#xff0c;你工作五年了&#xff0c;这个需求我交给你一个人负责很是…

开源写作平台WriteFreely(基础篇)

什么是 WriteFreely ? WriteFreely 是一个专为作家打造的干净、极简主义的出版平台。可以用来创建一个博客&#xff0c;在您的组织内分享知识&#xff0c;或者围绕共同的写作行为建立一个社区。 这里值得一提的是&#xff0c; WriteFreely 支持 ActivityPub 协议&#xff0c;这…

逐句回答,流式返回,ChatGPT采用的Server-sent events后端实时推送协议Python3.10实现,基于Tornado6.1

善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的&#xff0c;同样&#xff0c;ChatGPT后台Api接口请求中&#xff0c;如果将Stream参数设置为True后&#xff0c;Api接口也可以实现和ChatGPT网页端一样的流式返回&#xff0c;进而更快地给到前端用户反馈&…

剑指offer在排序数组中的二分法应用总结

排序数组中的搜索问题&#xff0c;首先想到 二分法 解决&#xff0c;本篇详细解析关于二分法边界的问题。 目录 一、二分法概念 二、剑指Offer53.在排序数组中查找数字 三、在排序数组中查找元素的第一个和最后一个位置 一、二分法概念 二分法就是在一个有序递增的数组中进行…

使用RabbitMQ发送短信

1、在项目中分别创建模块financial-core、financial-mq、financial-sms&#xff0c;如图&#xff1a; 模块构成 <modules><module>financial-common</module><module>financial-base</module><module>financial-core</module><mo…

剑指 Offer 66. 构建乘积数组

摘要 剑指 Offer 66. 构建乘积数组 一、左右乘积列表 我们不必将所有数字的乘积除以给定索引处的数字得到相应的答案&#xff0c;而是利用索引左侧所有数字的乘积和右侧所有数字的乘积&#xff08;即前缀与后缀&#xff09;相乘得到答案。对于给定索引i&#xff0c;我们将使…

Qt广告机服务器(上位机)

目录功能结构adSever.promain.cpptcp_MSG.h 共用Tcp传输信息adsever.h 服务器adsever.cpp 服务器addate.h 时间处理addate.cpp 时间处理adtcp.h 客户端Socket处理adtcp.cpp 客户端Socket处理client.h 客户端信息类client.cpp 客户端信息类admsglist.h 信息记录模块admsglist.cp…

jupyter的使用

1.安装 安装过程看这篇记录。 安装 2.如何启动 环境搭建好后&#xff0c;本机输⼊jupyter notebook命令&#xff0c;会⾃动弹出浏览器窗⼝打开 Jupyter Notebook # 进⼊虚拟环境 workon ai(这个是虚拟环境的名称) # 输⼊命令 jupyter notebook本地notebook的默认URL为&…

宝藏级BI数据可视化功能|图表联动分析

在浏览其他人的BI数据可视化报表时&#xff0c;经常会发现这样的一个现象&#xff0c;点一下上一张数据可视化图表中的某个门店&#xff0c;下一张图表将立即针对该门店展开数据可视化分析。这是什么效果&#xff1f;怎么实现&#xff1f;BI软件中还有多少宝藏级BI数据可视化功…

Oracle表分区的创建、新增、拆分

Oracle中为了方便管理、查询数据当数据量大于500w或者2G时最好用分区表&#xff0c;常见的一种是使用时间作为分区。 分区表添加新的分区有 2 种情况&#xff1a; (1) 原分区里边界是 maxvalue 或者 default。 这种情况下&#xff0c;我们需要把边界分区 drop 掉&#xff0c;加…

好的计划是成功的一半,如何制定项目计划?

好的计划是成功的一半&#xff0c;不好的计划会使项目一步步失败&#xff0c;任何事情&#xff0c;要取得成功&#xff0c;离不开一个科学合理的计划。 计划是为了实现项目所提出的各项目标&#xff0c;每一项任务都是针对某一个特定目标的&#xff0c;因此&#xff0c;一项计划…