当前位置: 首页 > article >正文

JVM——内存溢出和内存泄漏

目录

  • 1. 内存溢出和内存泄漏
    • 内存泄漏的常见场景
    • 解决内存溢出的思路
      • 1.发现问题 – Top命令
      • 2.发现问题 – VisualVM
      • 3.发现问题 – Arthas
      • 4.发现问题 – Prometheus + Grafana
      • 5.发现问题 – 堆内存状况的对比![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/058d113715b34978b0cecd515d91f363.png)

1. 内存溢出和内存泄漏

⚫ 内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。
⚫ 内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没有特别说明则讨论的都是堆内存泄漏在这里插入图片描述

⚫ 少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,就像滚雪球雪球越滚越大,不管有多大的内存迟早会被消耗完,最终导致的结果就是内存溢出。但是产生内存溢出并不是只有内存泄漏这一种原因。在这里插入图片描述
在这里插入图片描述

内存泄漏的常见场景

⚫ 内存泄漏导致溢出的常见场景是大型的Java后端应用中,在处理用户的请求之后,没有及时将用户的数据删
除。随着用户请求数量越来越多,内存泄漏的对象占满了堆内存最终导致内存溢出。
⚫ 这种产生的内存溢出会直接导致用户请求无法处理,影响用户的正常使用。重启可以恢复应用使用,但是在运行一段时间之后依然会出现内存溢出。在这里插入图片描述


⚫ 第二种常见场景是分布式任务调度系统如Elastic-job、Quartz等进行任务调度时,被调度的Java应用在调度任务结束中出现了内存泄漏,最终导致多次调度之后内存溢出。
⚫ 这种产生的内存溢出会导致应用执行下次的调度任务执行。同样重启可以恢复应用使用,但是在调度执行一段时间之后依然会出现内存溢出。在这里插入图片描述

解决内存溢出的思路

解决内存溢出的步骤总共分为四个步骤,其中前两个步骤是最核心的:
在这里插入图片描述

1.发现问题 – Top命令

⚫ top命令是linux下用来查看系统信息的一个命令,它提供给我们去实时地去查看系统的资源,比如执行时的进程、线程和系统参数等信息。
⚫ 进程使用的内存为RES(常驻内存)- SHR(共享内存)
在这里插入图片描述

2.发现问题 – VisualVM

⚫ VisualVM是多功能合一的Java故障排除工具并且他是一款可视化工具,整合了
命令行 JDK 工具和轻量级分析功能,功能非常强大。
⚫ 这款软件在Oracle JDK 6~8 中发布,但是在 Oracle JDK 9 之后不在
JDK安装目录下需要单独下载。下载地址:https://visualvm.github.io/
在这里插入图片描述

3.发现问题 – Arthas

⚫ Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。在这里插入图片描述
在这里插入图片描述

4.发现问题 – Prometheus + Grafana

⚫ Prometheus+Grafana是企业中运维常用的监控方案,其Prometheus用来采集系统或者应用的相关数据,同时具备告警功能。Grafana可以将Prometheus采集到的数据以可视化的方式进行展示。
⚫ Java程序员要学会如何读懂Grafana展示的Java虚拟机相关的参数在这里插入图片描述

5.发现问题 – 堆内存状况的对比在这里插入图片描述


http://www.kler.cn/news/155437.html

相关文章:

  • 【知识】稀疏矩阵是否比密集矩阵更高效?
  • python动态圣诞下雪图
  • vue-历史模式部署
  • 【面试HOT200】回溯篇
  • Node.js版本管理工具NVM(Node Version Manager)的使用
  • leetcode - 矩阵区域和
  • 第十五届蓝桥杯模拟赛(第二期)
  • 软件生命周期四个阶段SDLC
  • Day59权限提升-win溢出漏洞ATSCps提权
  • 三菱(MITSUBISHI)CNC数据采集
  • 打印时如何让打印字体更加平滑 不那么锯齿化
  • csapp-linklab
  • AArch64中的虚拟化
  • 【Android】Retrofit创建实例源理
  • Flyway 数据库版本管理 | 专业解决方案
  • 31、LCD1602功能函数代码
  • AURIX TC芯片中DSU实现安全启动
  • Excel 分列功能
  • 20、Resnet 为什么这么重要
  • Go语言 值传递
  • 【蓝桥杯软件赛 零基础备赛20周】第6周——栈
  • 分析实现HarmonyOS中的Linux内核架构模式
  • 2312skia,17路径和api概述
  • 【go语言开发】loglus日志框架的使用
  • mysql8.0 提取json数据转为行
  • 基于SpringBoot+Vue实现的前后端分离课程管理系统
  • 树与二叉树堆:经典OJ题集(2)
  • 2023.12.03 homework
  • 1094. 拼车 --力扣 --JAVA
  • PostgreSQL日志中的SQL记录时机 —— log_statement 和 log_min_duration_statement