怎么避免服务内存溢出?
创始人
2025-05-28 15:30:33
0

在高并发、高吞吐的场景下,很多简单的事情,会变得非常复杂,而很多程序并没有在设计时针对高并发高吞吐量的情况做好内存管理。

自动内存管理机制的实现原理

做内存管理,主要考虑申请内存和内存回收两部分。

申请内存的步骤:

  1. 计算要创建的对象需要占用多少内存
  2. 在内存中找一块连续并且是空闲的内存空间,标记为已占用

内存回收需要主要做2件事情。

  1. 找出所有可以回收的对象,将其标记为空闲
  2. 整理内存碎片

现代GC算法大部分采用“标记-清除”算法或者他的变种算法,这种算法分为标记和清除两个阶段:

  • 标记阶段:从GC Root开始,可以简单把GC Root理解为程序入口的那个对象,标记所有可达的对象,因为程序中所有在用的对象一定会被这个GC Root直接引用或者间接引用。
  • 清除阶段:遍历所有对象,找出所有没有标记的对象,这些没有标记的对象都是可以被回收的,清除这些对象,释放相应的内存。

“标记-清除”算法的一个最大问题,是在标记和清除过程中,必须先把进程暂停,否则计算的结果就是不准确的。这也是为什么发生垃圾回收的时候,我们的程序会卡死的原因。

需要注意,垃圾回收完成后,我们还需要进行内存碎片整理,将不连续的空闲内存移到到一起,以便空出足够的连续内存空间供后需用。

虽然自动内存管理机制有效地解决了内存泄露问题,带来的代价是执行垃圾回收时会暂停进程,如果暂停的时间过长,程序看起来就像“卡死了”一样。

服务为什么会在高并发时忽然“卡死”?

在高并发、高吞吐量场景下,我们的程序会非常忙,短时间内会创建大量的对象,这些对象会迅速占满内存,由于没有内存可用,垃圾回收被迫开始启动,并且,这次被迫执行的垃圾回收面临的是占满整个内存的海量对象,它执行的时间也会增加,相应的,这个回收过程会导致进程长时间暂停。

进程长时间暂停,又会导致大量的请求积压等待结果,垃圾回收刚刚结束,更多的请求立刻涌来,迅速占满内存,再次被迫执行垃圾回收,进入一个恶性循环,如果垃圾回收的速度跟不上创建对象的速度,还可能会产生内存溢出的现象。

高并发下的内存管理技巧

对于开发者来说,垃圾回收是不可控的,而且是无法避免的,但是,我们可以通过一些方法来降低垃圾回收的频率,减少进程暂停的时长。

我们需要考虑在处理大量请求的同时,尽量少的产生一次性对象,特别是占用内存比较大的对象。我们可以按照这个思路来优化对象的业务代码。

对于需要频繁使用、占用内存较大的一次性对象,我们可以考虑自行回收并重用这些对象,例如我们可以为这些对象创建一个对象池,收到请求后,在对象池里面申请一个对象,使用完后再放回到对象池中,这样就可以反复地重复使用这些对象,非常有效地避免频繁触发垃圾回收。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...