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

简介: 【项目实战典型案例】20.内存长期占用导致系统慢

一:背景介绍

目前又出现了爬取加载慢的情况;查了现在core服务的内存占用也是很高。

二:思路&方案

服务内存占用过高的原因

  1. 服务启动时分配的堆内存过小
  2. 具有大量对象被创建,并且没有及时被GC回收或者由于具有引用GC无法回收
  3. 当GC之后,虽然会清理堆内的对象,但是并不会释放内存,没有把曾经申请到的内容归还给操作系统

如何解决服务内存占用过高的原因

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

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

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

1)、分析dump文件找到内存占用的原因

①使用命令生成dump文件,其中 pid为进程号,生成的dump文件会在当前目录下。(生产环境运行时,禁止使用)

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

②使用jvisual分析dump文件(是jdk1.8自带的分析工具)

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

可以参考GC机制详解

  1. 尽早释放无用对象的引用
  2. 尽量少用finalize函数
  3. 如果需要使用经常使用的图片,可以使用soft应用类型。它可以尽可能将图片保存在内存中,供程序调用,而不引起OutOfMemory
  4. 注意结合数据类型,包括数组、树、图、链表等数据结构
  5. 可以手动执行System.gc()


相关文章
|
存储 编译器 Go
Go 语言内存逃逸案例
Go 语言内存逃逸案例
118 0
|
11月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
1060 7
|
NoSQL 程序员 Linux
轻踩一下就崩溃吗——踩内存案例分析
踩内存问题分析成本较高,尤其是低概率问题困难更大。本文详细分析并还原了两个由于动态库全局符号介入机制(it's a feature, not a bug)触发的踩内存案例。
|
Java
堆内存的溢出案例分析
堆内存的溢出案例分析
92 0
|
存储 负载均衡 算法
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
227 2
|
缓存 Dubbo Java
案例 1: 某财险承保系统内存泄漏问题
案例 1: 某财险承保系统内存泄漏问题
|
4月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
1531 0
|
4月前
|
存储 缓存 NoSQL
内存管理基础:数据结构的存储方式
数据结构在内存中的存储方式主要包括连续存储、链式存储、索引存储和散列存储。连续存储如数组,数据元素按顺序连续存放,访问速度快但扩展性差;链式存储如链表,通过指针连接分散的节点,便于插入删除但访问效率低;索引存储通过索引表提高查找效率,常用于数据库系统;散列存储如哈希表,通过哈希函数实现快速存取,但需处理冲突。不同场景下应根据访问模式、数据规模和操作频率选择合适的存储结构,甚至结合多种方式以达到最优性能。掌握这些存储机制是构建高效程序和理解高级数据结构的基础。
457 1

热门文章

最新文章