JAVA虚拟机实战篇之内存调优[1](内存泄露和溢出概念、常见场景、解决思路)

文章目录

  • 内存泄漏(memory leak)
    • 内存溢出(Out of Memory):
  • 内存泄漏的常见场景
    • 场景一:未删除用户数据
      • 场景二:分布式任务调度
  • 解决内存溢出
    • 解决内存溢出思路
      • 发现问题 – Top命令
      • 发现问题 – VisualVM
      • 发现问题 – Arthas
      • 使用arthas tunnel管理所有的需要监控的程序
      • 发现问题 – Prometheus + Grafana
      • 发现问题–堆内存状况的对比

内存泄漏(memory leak)

  • 内存泄漏是指程序中的某个对象(或一组对象)被错误地保留在内存中,而无法被垃圾回收器回收。这些对象将继续占用内存,导致系统中的可用内存逐渐减少,最终可能导致内存耗尽。
  • 内存泄漏绝大多数情况都是由堆内存泄漏引起的(所以没有特别说明,则讨论的都是堆内存泄漏)。
  • 内存泄漏的常见原因包括:
    • 未正确关闭资源: 如果程序打开了文件、网络连接、数据库连接等资源,但在使用完后未正确关闭,就可能导致内存泄漏。
    • 循环引用: 当两个或多个对象相互引用,但它们之间没有被及时断开引用,就会导致这些对象无法被垃圾回收。
    • 静态集合持有对象: 静态集合(如静态列表、Map等)可能在应用程序的整个生命周期内持有对象的引用,如果不及时清理,可能导致内存泄漏。
  • 为了避免内存泄漏,开发者可以:
    • 确保及时关闭使用的资源。
    • 避免不必要的对象引用,特别是循环引用。
    • 使用弱引用(WeakReference)等机制来管理对象的生命周期。
    • 使用工具和分析技术(如内存分析工具)来检测和解决潜在的内存泄漏问题。
      在这里插入图片描述
  • 少量的内存泄漏可以容忍,但是如果发生持续的内存泄漏,内存迟早会被消耗完,最终导致的结果就是内存溢出但是产生内存溢出并不是只有内存泄漏这一种原因。
    在这里插入图片描述
    在这里插入图片描述

内存溢出(Out of Memory):

  • 内存溢出是指程序在运行过程中申请的内存超出了JVM(Java虚拟机)所能提供的最大内存限制,导致无法继续分配新的对象,最终导致程序崩溃。内存溢出通常发生在以下几种情况下:

    • 无限制的对象创建: 如果应用程序在循环中创建大量对象而没有及时释放,可能导致内存溢出。
    • 递归调用: 过深的递归调用也可能导致栈溢出,间接导致内存溢出。
    • 内存泄漏: 长时间运行的应用程序中,如果存在内存泄漏,最终会导致内存溢出。
    • 过大的数据集: 当应用程序试图加载过大的数据集时,可能会导致内存溢出。
  • 为了避免内存溢出,可以:

    • 优化代码,减少不必要的对象创建。
    • 及时释放不再使用的对象,避免长时间保持引用。
    • 调整JVM堆内存参数,增加可用的堆内存。

内存泄漏的常见场景

场景一:未删除用户数据

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

场景二:分布式任务调度

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

解决内存溢出

解决内存溢出思路

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

发现问题 – Top命令

  • top命令是linux下用来查看系统信息的一个命令,它提供实时地去查看系统的资源,比如执行时的进程、线程和系统参数等信息。
  • 进程使用的内存为RES(常驻内存)- SHR(共享内存)
    在这里插入图片描述
  • 优点:操作简单;无额外的软件安装、
  • 缺点:只能查看最基础的进程信息,无法查看到每个部分的内存占用(堆、方法区、堆外)

发现问题 – VisualVM

  • VisualVM是多功能合一的Java故障排除工具并且他是一款可视化工具,整合命令行 JDK 工具和轻量级分析功能,功能非常强大
  • 这款软件在Oracle JDK 6~8 中发布,但是在 Oracle JDK 9 之后不在JDK安装目录下需要单独下载。下载地址
    在这里插入图片描述
  • 优点:功能丰富,实时监控CPU、内存、线程等详细信息;支持Idea插件,开发过程中也可以使用
  • 缺点:对大量集群化部署的Java进程需要手动进行管理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

发现问题 – Arthas

  • Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
  • 优点:功能强大,不止于监控基础的信息,还能监控单个方法的执行耗时等细节内容;支持应用的集群管理
  • 缺点:部分高级功能使用门槛较高
    在这里插入图片描述

使用arthas tunnel管理所有的需要监控的程序

  • 使用微服务架构,生产环境上的应用数量非常多,使用arthas还得登录到每一台服务器上再去操作非常不方便可以使用tunnel来管理所有需要监控的程序。
    在这里插入图片描述
    步骤:
  1. 在Spring Boot程序中添加arthas的依赖(支持Spring Boot2),在配置文件中添加tunnel服务端的地址,便于tunnel去监控所有的程序。官方指导文档
  2. 将tunnel服务端程序部署在某台服务器上并启动。
  3. 启动java程序
  4. 打开tunnel的服务端页面,查看所有的进程列表,并选择进程进行arthas的操作。

发现问题 – Prometheus + Grafana

  • prometheus 是一套开源的系统监控报警框架。
  • Prometheus+Grafana是企业中运维常用的监控方案,其中Prometheus用来采集系统或者应用的相关数据,同时具备告警功能。Grafana可以将Prometheus采集到的数据以可视化的方式进行展示
  • Java程序员要学会如何读懂Grafana展示的Java虚拟机相关的参数。
  • 优点:
    • 支持系统级别和应用级别的监控,比如linux操作系统、Redis、MySQL、Java进程。
    • 支持告警并允许自定义告警指标,通过邮件、短信等方式尽早通知相关人员进行处理
  • 缺点:环境搭建较为复杂,一般由运维人员完成

发现问题–堆内存状况的对比

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/435119.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云计算OpenStack KVM迁移

动态迁移 static migration 静态迁移 cold migration 冷迁移 offline migration 离线迁移 live migration 动态迁移 hot migration 热迁移 online migration 在线迁移 衡量 整体迁移时间 服务器停机时间 性能影响(迁移后和其它客户机) 特点 负载均衡 解除硬件依赖…

算法刷题day22:双指针

目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法,主要是用来处理枚举子区间的事,时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) &#xf…

three.js如何实现简易3D机房?(四)点击事件+呼吸灯效果

接上一篇: three.js如何实现简易3D机房?(三)显示信息弹框/标签:http://t.csdnimg.cn/5W2wA 目录 八、点击事件 1.实现效果 2.获取相交点 3.呼吸灯效果 4.添加点击事件 5.问题解决 八、点击事件 1.实现效果 2.…

postman登录鉴权之接口测试

一.背景 在做接口测试的时候,有些接口向后台请求数据的时候,是需要用户在登录情况下才有数据返回。 以电商平台为例,用户的个人中心,用户的订单列表,用户的支付信息等等,所有用户维度的数据都是需要登录态…

网络原理TCP_IP

文章目录 应用层自定义协议 传输层udp协议TCP协议1.确认应答2.超时重传3.连接管理建立连接, 三次握手断开连接, 四次挥手tcp的状态 4.滑动窗口5.流量控制6.拥塞控制7.延时应答8.携带应答9.面向字节流10.异常情况 网络层IP协议地址管理路由选择 数据链路层以太网 应用层 自定义…

okHttp MediaType MIME格式详解

一、介绍 我们在做数据上传时,经常会用到Okhttp的开源库,okhttp开源库也遵循html提交的MIME数据格式。 所以我们经常会看到applicaiton/json这样的格式在传。 但是如果涉及到其他文件等就需要详细的数据格式,否则服务端无法解析 二、okHt…

【信息系统项目管理师】--【信息技术发展】--【新一代信息技术及应用】--【虚拟现实】

文章目录 第二章 信息技术发展2.2 新一代信息技术及应用2.2.6 虚拟现实1.技术基础2.关键技术3.应用和发展 第二章 信息技术发展 信息技术是在信息科学的基本原理和方法下,获取信息、处理信息、传输信息和使用信息的应用技术总称。从信息技术的发展过程来看&#xff…

3.5 力扣 交错字符串

97. 交错字符串 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s s1 s2 ... snt t1 t2 ... tm|n - m| &…

PDF处理控件aspose.PDF功能演示:将 PDF 转换为 Word 文档

在 Web 应用程序中处理文档时,将 PDF 文件无缝转换为 Word 文档的能力是一项宝贵的资产。此任务不仅常见,而且对于文档转换器和编辑器、从编辑和协作到内容提取的各种应用程序来说也是必不可少的。在这篇博文中,我们将探讨如何使用 JavaScrip…

【vue3之组合式API】

组合式API 一、setup1.写法2.如何访问3.语法糖4.同步返回对象 二、reactive()和ref()1.reactive()2.ref() 三、computed四、watch函数1侦听单个数据2.侦听多个数据3. immediate4. deep5.精确侦听对象的某个属性 五、生命周期函数六、组件通信1.父传子2. 子传父 七、模版引用1. …

数字创新的风口:创业者如何在Web3时代抢占先机

随着区块链技术的不断发展,Web3正成为数字创新的新风口,为创业者们带来了前所未有的机遇和挑战。本文将从另一个角度探讨Web3对创业者的影响,并提出创业者在Web3时代抢占先机的策略和方法。 1. Web3重新定义了商业模式 Web3不仅仅是一种技术…

Java设计模式:建造者模式之经典与流式的三种实现(四)

本文将深入探讨Java中建造者模式的两种实现方式:经典建造者与流式建造者。建造者模式是一种创建型设计模式,它允许你构建复杂对象的步骤分解,使得对象的创建过程更加清晰和灵活。我们将通过示例代码详细解释这两种实现方式,并分析…

重塑Android通信新格局:探秘Android 8.0之后的Binder架构革新

重塑Android通信新格局:探秘Android 8.0 之后的Binder架构革新 1. 引言 Android作为全球主流移动操作系统,在移动设备领域扮演着举足轻重的角色。其开放性、灵活性和广泛的应用生态系统使得无数用户和开发者受益。作为一个基于Linux内核的操作系统,Android的核心架构设计至…

Spring Webflux 详解

目录 0、组件对比 1、WebFlux 1、引入 2、Reactor Core 1、HttpHandler、HttpServer 3、DispatcherHandler 1、请求处理流程 4、注解开发 1、目标方法传参 2.返回值写法 5、文件上传 6、错误处理 7、RequestContext 8、自定义Flux配置 9、Filter WebFlux&am…

Elasticsearch模拟网络丢包

背景 Elasticsearch一旦遇到网络抖动就可能节点(单个或者多个)掉出集群。从而集群出现red/yellow状态,理论情况下ES会自愈,但某些情况下可能非预期,此时就需要我们模拟各种case了,比如网络丢包。 操作 1…

postman Unable to load data as you are offline解决办法 重新登陆无效

postman Unable to load data as you are offline解决办法 重新登陆无效 也能如下一直打不开 - 重新登陆试过了 没有效果 - 刚刚代理切换到了全局,软件内的开关开启了 修改后

鸿蒙NEXT开发实战:【网络管理-数据请求】

概述 本示例仿postman输入API接口地址,获取相应数据,介绍数据请求接口的用法。 样例展示 基础信息 Http 介绍 本示例通过[ohos.net.http]等接口,实现了根据URL地址和相关配置项发起http请求的功能。 效果预览 首页结果页 使用说明 1.…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…

备战蓝桥杯————二分查找(二)

引言 在上一篇博客中&#xff0c;我们深入探讨了二分搜索算法及其在寻找数组左侧边界的应用。二分搜索作为一种高效的查找方法&#xff0c;其核心思想在于通过不断缩小搜索范围来定位目标值。在本文中&#xff0c;我们将继续这一主题&#xff0c;不仅会回顾二分搜索的基本原理&…

leetcode 热题 100_最小覆盖子串

题解一&#xff1a; 双指针滑动窗口&#xff1a;暴力解法——用双指针来表示字符串s中的子串首尾&#xff0c;遍历所有子串并与字符串t判断是否符合条件。我们可以对遍历和判断的过程进行优化&#xff0c;首先是遍历&#xff0c;右指针先移动直到涵盖所以需要的字母&#xff0c…