【项目实战典型案例】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()


目录
打赏
0
0
0
0
1
分享
相关文章
Go 语言内存逃逸案例
Go 语言内存逃逸案例
89 0
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
659 7
轻踩一下就崩溃吗——踩内存案例分析
踩内存问题分析成本较高,尤其是低概率问题困难更大。本文详细分析并还原了两个由于动态库全局符号介入机制(it's a feature, not a bug)触发的踩内存案例。
堆内存的溢出案例分析
堆内存的溢出案例分析
65 0
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数
170 2
|
2月前
|
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
269 55
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
152 6
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
241 29
JVM简介—1.Java内存区域

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等