【教学典型案例】20.内存长期占用导致系统慢
创始人
2024-06-02 19:24:08

目录

  • 一:背景介绍
  • 二:思路&方案
    • 服务内存占用过高的原因
    • 如何解决服务内存占用过高的原因
      • 1、服务启动时分配的堆内存过小
      • 2、具有大量对象被创建,并没有及时被GC回收或者由于具有引用GC无法回收
        • 1)、分析dump文件找到内存占用的原因
      • 3、当GC之后,虽然会清理堆内的对象,但是并不会释放内存,没有把曾经申请到的内容归还给操作系统

一:背景介绍

目前又出现了爬取加载慢的情况;查了现在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= 

②使用jvisual分析dump文件(是jdk1.8自带的分析工具)
在这里插入图片描述
在这里插入图片描述

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

可以参考GC机制详解

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

相关内容

热门资讯

伊朗高级领导层否认与美国进行了... 格隆汇3月23日|据央视,当地时间3月23日,伊朗几位“高级领导层”表示,特朗普当日声称正在与伊朗进...
豆神教育:董事长窦昕辞职 唐颖... 3月23日,豆神教育(维权)(300010)发布公告,董事长窦昕因工作安排调整辞去董事长及非独立董事...
RadexMarkets瑞德克... 3月23日,近期,加密货币市场在关键周线收官之际遭遇剧烈波动,比特币价格在周末跌破69000美元关口...
吉林省一地拍到“巨鸟”过马路,... (来源:长春相遇)老铁别急!“座山雕”国道溜达,东北大哥大姐齐让路老话说得好,“春江水暖鸭先知”,可...
03月23日 美元兑泰铢跌破3... Hehson外汇消息2026年03月23日,截至19时31分,外汇市场上美元兑泰铢汇率跌破1美元兑换...