【教学典型案例】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()

相关内容

热门资讯

炬光科技股价涨5.24%,建信... 1月27日,炬光科技涨5.24%,截至发稿,报199.00元/股,成交3.18亿元,换手率1.86%...
矿区彭城镇河泉村村民通过网络直... (来源:邯郸晚报) 临近春节,峰峰矿区彭城镇河泉村的多肉花卉绿植大棚里热闹非凡。棚内多肉萌趣可爱、绿...
新洁能涨2.01%,成交额4.... 1月27日,新洁能盘中上涨2.01%,截至10:10,报44.08元/股,成交4.18亿元,换手率2...
深圳强化政采监管显成效 (来源:中国政府采购报)转自:中国政府采购报新闻第一站深圳强化政采监管显成效本报讯 记者袁瑞娟 通讯...
汇绿生态股价涨5.29%,海富... 1月27日,汇绿生态涨5.29%,截至发稿,报26.89元/股,成交5.21亿元,换手率3.32%,...