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

相关内容

热门资讯

晋拓股份跌6.21%,成交额1... 7月28日,晋拓股份跌6.21%,成交额1.48亿元,换手率2.27%,总市值63.60亿元。异动分...
鸿铭股份涨5.09%,成交额2... 7月28日,鸿铭股份涨5.09%,成交额2157.17万元,换手率2.56%,总市值21.68亿元。...
咸亨国际涨0.00%,成交额6... 7月28日,咸亨国际涨0.00%,成交额6845.52万元,换手率1.28%,总市值53.79亿元。...
奥普特跌6.78%,成交额2.... 7月28日,奥普特跌6.78%,成交额2.93亿元,换手率2.19%,总市值130.47亿元。异动分...
凯盛新材跌0.06%,成交额8... 7月28日,凯盛新材跌0.06%,成交额8883.47万元,换手率1.31%,总市值71.56亿元。...