如何分析 JVM 内存瓶颈浅谈

news2024/9/24 13:21:29

背景:

当操作系统内存出现瓶颈时,我们便会重点排查那个应用占用内存过大。对于更深一步分析内存的使用,就进一步去了解内存结构,应用程序使用情况,以及内存如何分配、如何回收,这样你才能更好地确定内存的问题。

JVM 内存分配:

JVM(Java虚拟机)内存分配是指Java程序运行时,JVM对内存的分配和管理。JVM将内存划分为不同的区域,每个区域有不同的作用和生命周期。以下是JVM内存分配的详细解释:

  1. 方法区(Method Area):
    方法区用于存储类的结构信息,如类的字节码、常量池、静态变量、方法信息等。方法区在JVM启动时被创建,并且被所有线程共享。在JDK 8及之前,方法区是一个逻辑上的概念,实际上是通过永久代(Permanent Generation)实现的。但在JDK 8及以后,永久代被元空间(Metaspace)所取代。元空间使用本地内存来存储类的元数据。

  2. 堆(Heap):
    堆是用于存储对象实例的区域。所有在Java程序中创建的对象都存放在堆中。堆是线程共享的,被所有线程访问和操作。堆的大小可以通过启动参数进行调整。当堆中没有足够的空间容纳新创建的对象时,会触发垃圾回收(GC)来回收不再使用的对象,以释放内存。

    堆又可进一步划分为新生代(Young Generation)和老年代(Old Generation):

    • 新生代:新创建的对象首先被分配到新生代。新生代又分为一个Eden区和两个Survivor区(通常称为From区和To区)。
    • 老年代:当对象在新生代经过多次垃圾回收后仍然存活,它们会被晋升到老年代。老年代主要存放生命周期较长的对象。
  3. 栈(Stack):
    栈用于存储线程的方法调用和局部变量。每个线程在运行时都会创建一个栈帧,用于存储方法的局部变量表、操作数栈、动态链接、方法出口等信息。栈的大小是固定的,由虚拟机在启动时分配。栈是线程私有的,每个线程都有自己独立的栈。

    栈又可进一步划分为:

    • Java虚拟机栈(Java Virtual Machine Stack):存储Java方法执行的线程栈帧。
    • 本地方法栈(Native Method Stack):存储Native方法执行的线程栈帧。
  4. 本地方法栈(Native Method Stack):
    本地方法栈用于存储Java程序调用本地方法(使用JNI接口)时的栈信息。

  5. PC寄存器(Program Counter Register):
    PC寄存器存储当前线程执行的字节码指令的地址。

  6. 常量池(Constant Pool):
    常量池用于存放编译期生成的各种字面量和符号引用。

  7. 直接内存(Direct Memory):
    直接内存是堆外内存,不受JVM内存管理的限制。它通常由NIO(New Input/Output)库使用,通过与操作系统进行直接交互来提高I/O性能。

JVM会根据程序的运行情况动态调整各个内存区域的大小,并进行垃圾回收来释放不再使用的内存。对于编程者来说,特别需要注意的是堆和栈这两个区域,因为它们直接与对象和方法调用相关。而这其中堆空间占据着 JVM 中最大的存储区域,存放了很多对象,所以大多数基于 JVM 的内存调优也是对堆空间的调优。

JVM 垃圾回收:

在JVM内存管理中,内存被划分为新生代(Young Generation)和老年代(Old Generation),不同的垃圾回收算法和策略被应用于这两个代中。下面我将详细讲解新生代和老年代的垃圾回收过程。

新生代垃圾回收过程:

新生代是用于存放新创建的对象的区域,通常包括一个Eden区和两个Survivor区(通常称为From区和To区)。新生代垃圾回收主要包括以下几个阶段:

  Eden区:新创建的对象首先会被分配到Eden区。当Eden区满时,会触发一次新生代垃圾回收。

  标记阶段(Marking Phase):在标记阶段,垃圾回收器会标记所有在Eden区和From区中仍然存活的对象。

  复制阶段(Copying Phase):在复制阶段,垃圾回收器将标记的存活对象从Eden区和From区复制到To区。同时,它也会清空Eden区和From区的对象。

  交换Survivor区(Swap Survivor):在复制阶段完成后,垃圾回收器会交换From区和To区的角色,使得To区成为下一次垃圾回收时的From区。

  清除阶段(Sweeping Phase):在清除阶段,垃圾回收器会清空From区中的对象。此时,Eden区和To区是空的,可以用于下一轮的对象分配。

  新生代采用的是复制算法,该算法的优点是简单高效,但代价是需要将存活的对象复制到另一个区域,这对于存活对象较多的场景会带来一定的性能开销。

老年代垃圾回收过程:

老年代是用于存放存活时间较长的对象的区域,通常包括大对象、长时间存活的对象以及从新生代晋升过来的对象。老年代垃圾回收主要包括以下几个阶段:

  标记阶段(Marking Phase):与新生代的标记阶段类似,垃圾回收器会标记老年代中所有存活的对象。

  清除阶段(Sweeping Phase):在清除阶段,垃圾回收器会清除未标记的对象,并释放它们占用的内存空间。

  整理阶段(Compacting Phase):在整理阶段,垃圾回收器会将存活的对象向老年代的一端移动,从而消除内存碎片,使得老年代的空间得以连续。

  老年代的垃圾回收一般采用标记-清除-整理算法(Mark-Sweep-Compact),该算法通过整理阶段解决了老年代内存碎片的问题。

如何定位内存占用问题:

  已经知道jvm一些基础知识,那么该如何去定位瓶颈问题呢,主要有两个过程:

  • 观察 GC 的频次;
  • 定位占用内存的对象。
1.如何观察 GC 的频次?

JDK 自带的工具jstat,使用 jstat 来查看 GC 的频次,如下所示:

[root]# jstat -gc 26607 1000 3

 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT

512.0  512.0  320.0   0.0   86016.0  27828.5   175104.0   157974.6  122840.0 116934.9 16128.0 15060.4   5328   37.311   4      1.042   38.353

512.0  512.0  320.0   0.0   86016.0  27981.9   175104.0   157974.6  122840.0 116934.9 16128.0 15060.4   5328   37.311   4      1.042   38.353

512.0  512.0  320.0   0.0   86016.0  28885.4   175104.0   157974.6  122840.0 116934.9 16128.0 15060.4   5328   37.311   4      1.042   38.353

输出项中有很多以 C 或者 U 结尾。S0 则代表第一个 Survivor 区,也就是我上文说的 From 区。通过以上的讲解,比如 S1C 和 S1U 则表示第二个 Survivor 区也就是 To 区的总容量和使用容量。

其他的输出选项含义。

  • EC / EU:Eden 区的总容量/已使用空间的大小。
  • OC / OU:老年代总容量/老年代已使用空间大小。
  • MC / MU:方法区总容量/方法区已使用容量大小。
  • CCSC / CCSU:压缩类总容量/压缩类空间使用大小。
  • YGC / YGCT:年轻代垃圾回收的次数/年轻代垃圾回收消耗时间。
  • FGC / FGCT: 老年代垃圾回收次数/老年代垃圾回收消耗时间。
  • GCT:垃圾回收消耗总时间。

通过GC的次数和时间可以初步判断系统中是否存在垃圾回收的问题。以下是一些常见的情况,当它们出现时,可能提示存在垃圾回收问题:

频繁的Full GC:
Full GC是指对整个堆内存进行垃圾回收的操作,它会导致应用程序的停顿时间较长。如果频繁发生Full GC,即使在短时间内,这可能意味着内存不足、内存泄漏或对象生命周期管理不当等问题。

频繁的Young GC:
Young GC是指对新生代进行垃圾回收的操作。如果频繁发生Young GC,尤其是在短时间内,可能表明新生代的内存空间不足、对象过早晋升到老年代、对象存活时间过长等问题。

长时间的停顿:
如果垃圾回收的停顿时间过长(比如几百毫秒以上),会导致应用程序的性能下降、响应时间延长等问题。长时间的停顿可能是因为Full GC或者垃圾回收器的配置不合理。

如何定位占用内存的对象:

1. 利用JDK 自带的 JVM 监控工具:jvisual,jvisual 能做的事情很多,监控内存泄漏、跟踪垃圾回收、执行时内存分析、CPU 线程分析等,而且通过图形化的界面指引就可以完成,具体用法

可自行参考。

2. 利用jmap 工具,通过jmap -histo pid | head -n 10, 查看该进程的对象等详细信息,可重点关注结果展示的第五列,找出属于自己的业务类

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 731789136,里面有各种测试开发资料和技术可以一起交流哦。

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

62.乐理基础-打拍子-二八

前置知识:61.乐理基础-打拍子-休止符打法-CSDN博客 通过前置知识,知道了四分音符、二分音符、附点二分音符、全音符以及它们各自对应的休止符拍子的打法,如下图,它们都是最简单的,因为它们都是一拍的整数倍&#xff0…

竞赛保研 基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 🔥 优质竞赛项目系列&#xf…

山海鲸开发者视角:帮助汽车制造商取得市场优势

山海鲸可视化是一款致力于数字孪生领域的产品,为各行各业提供专业的数据可视化解决方案。作为山海鲸开发者,我们在开发免费好用的数字孪生工具同时也希望能让大家通过多种解决方案了解我们软件的多种可能性,本文就为大家介绍我们的汽车行业解…

JUC并发编程 09——队列同步器AQS

目录 一.Lock接口 1.1Lock的使用 1.2Lock接口提供的 synchronized 不具备的主要特性 1.3Lock接口的所有方法 二.队列同步器(AQS) 2.1队列同步器的接口与示例 2.2AQS实现源码分析 ①同步队列 ②获取锁 ③释放锁 一.Lock接口 说起锁,你肯定会想到 synchron…

MY FILE SERVER: 1

下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 首先我们需要发现ip 我的kali是59.162所以167就是靶机的 然后我们拿nmap扫一下端口 nmap -sV -p- 192.168.59.167 扫完发现有七个端口开放 按照习惯先看80 没看到有啥有用信息,用nikto扫一下 nik…

中文论文修改和润色哪个好写 papergpt

大家好,今天来聊聊中文论文修改和润色哪个好写,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:中文论文修改与润色:哪个更容易写&…

家校互通小程序实战开发01需求分析

目录 1 角色的划分2 用例分析3 创建业务数据源4 创建登录用户数据源总结 最近几年,随着移动互联网的深入发展,我们的日常生活和工作和微信已经紧密绑定。其实,有时候生活和工作的界限已经不明显,在我们的微信好友里既有家人、朋友…

助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题,公共环境下垃圾投放点都会有固定的值班时间,但是考虑到实际扔垃圾的无规律性,往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题,有些容易扩散的垃圾比…

VMware vcenter6.7安装(基于windows客户端)

一、下载vcenter6.7 1.下载地址,直接复制粘贴到web回车即可,这一步就不截图了。 从官网或者百旺网盘(可以自行搜索,或者私信我要) 二、安装部署vcenter6.7 将下载好的镜像文件拷贝到一台Windows机器上,…

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于法医调查算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.法医调查算法4.实验参数设定5.算法结果6.…

dpdk原理概述及核心源码剖析

dpdk原理 1、操作系统、计算机网络诞生已经几十年了,部分功能不再能满足现在的业务需求。如果对操作系统做更改,成本非常高,所以部分问题是在应用层想办法解决的,比如前面介绍的协程、quic等,都是在应用层重新开发的框…

Modbus转Profinet网关解决设备通讯不稳的问题

通讯不稳定:表现为数据断断续续,多半是由于线路干扰、接口不匹配、程序不稳定、等原因造成。 解决方案:在原配电柜添加Modbus转Profinet网关(XD-MDPN100/2000)即可解决通迅该问题,Modbus转Profinet网关&…

Python容器类公共操作

运算符 运算符Python 表达式结果描述支持的数据类型[1, 2] [3, 4][1, 2, 3, 4]合并字符串、列表、元组*["Hi!"] * 4[Hi!, Hi!, Hi!, Hi!]重复字符串、列表、元组in3 in (1, 2, 3)True元素是否存在字符串、列表、元组、字典not in4 not in (1, 2, 3)True元素是否不存…

Keil5 5.38官方下载、安装及注册教程(详细版)

一、下载地址 官方C51版本下载地址:https://www.keil.com/demo/eval/c51.htm 官方ARM版本下载地址:https://www.keil.com/demo/eval/arm.htm 注:两个版本的安装教程一样 Keil注册机2032年: 链接:https://pan.baidu.…

iMazing2024免费版iOS移动设备管理软件

以自己的方式管理iPhone,让备受信赖的软件为您传输和保存音乐、消息、文件和数据。安全备份任何 iPhone、iPad 或 iPod touch。iMazing 功能强大、易于使用,称得上是 Mac 和 PC 上最好的 iOS 设备管理器。 正在为iTunes繁琐的操作发愁?设备数…

【序列化和反序列化】

🍁什么是序列化和反序列化? 🍁典型解析🍁拓展知识仓🍁如何进行序列化和反序列化🍁未实现Serializable,可以序列化吗? 🍁典型解析 在Java中,我们可以通过多种方式来创建对…

魔众人才招聘系统全新升级!多城市精准对接,让招聘变得更简单高效!

好消息!魔众人才招聘系统v6.4.0全新版本火热上线!我们致力于为商家和兼职者提供一个更高效、更精准的对接平台。 多城市覆盖:无论您身处哪个城市,魔众都能为您提供丰富的人才资源。一键发布招聘信息,轻松找到心仪的兼…

内存不够用怎么办?三种方法解决!

内存越大,运行越快,程序之间的切换和响应也会更加流畅。但是随着时间的增加,还是堆积了越来越多的各种文件,导致内存不够用,下面就像大家介绍三种好用的清理内存的方法。 方法一:通过电脑系统自带的性能清理…

opencv入门到精通——形态学转换

目录 目标 理论 1. 侵蚀 2. 扩张 3. 开运算 4. 闭运算 5. 形态学梯度 6. 顶帽 7. 黑帽 结构元素 目标 在这一章当中, 我们将学习不同的形态学操作,例如侵蚀,膨胀,开运算,闭运算等。我们将看到不同的功能&…