【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )

简介: 【Java 虚拟机原理】垃圾回收算法( Java VisualVM 工具 | 安装 Visual GC 插件 | 使用 Java VisualVM 分析 GC 内存 )

文章目录

一、Java VisualVM 工具安装 Visual GC 插件

二、使用 Java VisualVM 分析 GC 内存





一、Java VisualVM 工具安装 Visual GC 插件


使用


jvisualvm


命令 , 打开 Java VisualVM 工具 ,


image.png


在弹出的 " 插件 " 对话框中 , 选择安装 " Visual GC " 插件 ,

image.png



点击 " 安装 " 按钮 , 弹出如下界面 , 点击 " 下一步 " 按钮 , 继续向后执行 ;

image.png



选择 " 我接受所有许可证协议中的条款(A) " 选项 , 点击 " 安装 " 按钮 ;

image.png



之后会很快安装完毕 , 插件安装完毕后 , 如下显示 , 点击 " 完成 " 按钮 , Visual GC 插件 安装完成 ;

image.png



在 Java VisualVM 工具 中 , 点击 IntelliJ IDEA 查看该进程的 GC 情况 , 选择 Visual GC 选项卡 , 即可查看内存细节 , 如 : 元空间 Metaspace , 老年代 Old Gen , 年轻代中的 Eden Space 区域 , Survivor 0 / 1 区域 ;



image.png





二、使用 Java VisualVM 分析 GC 内存


分析 GC 时间 与 Eden Space 区域 内存占用 , 每次 GC 时 , Eden Space 区域 内存使用就变小 , 将其中的对象都丢到了 Survivor 0 或 Survivor 1 区域中 ;


image.png


分析 GC 时间 与 Survivor 0 和 Survivor 1 区域的内存使用情况 , 每次 GC 时 , 清空一个区域 , 将数据都拷贝到另一个区域 , 这是垃圾回收算法中的 复制算法 ;

image.png



每次 GC 垃圾回收 , 对象的 分代年龄 都会 +1 , 当分代年龄到达一定数量 , 该对象就被判定为永生对象 , 同时将永生对象放到 老年区 , 老年区的内存也是缓慢增加 ;

image.png



一旦这几个内存区域全部装满 , 就会出现 OOM 异常 ; 左侧的 Old Gen 是老年代 , 右侧的 Eden + Survivor 0 + Survivor 1 是年轻代区域 ;


image.png



在 年轻代 内存 中 , minor GC 垃圾回收非常频繁 , 每次都要针对年轻代中的 对象 进行 GC Root 可达性分析 , 如果不可达 , 直接回收 , 如果可达 , 分代年龄 + 1 , 分代年龄到达 15 后 转入 老年代 ;


在 老年代 内存 中 , full GC 垃圾回收 , 不是很频繁 , 每次对 永生对象 进行 GC Root 可达性分析 , 不可达的对象直接回收 ;


如果一次创建一个大对象 , 则直接放入老年代中 , 因为大对象需要大块内存 , 在年轻代中 , 不适合操作大块内存 , 有很多内存碎片 ;


如果 年轻代 , 老年代 , 内存区域用完 , 新对象 创建后没有足够的内存存放 , 则出现 OOM ;


目录
相关文章
|
10月前
|
缓存 算法 Java
JVM深入原理(八)(一):垃圾回收
弱引用-作用:JVM中使用WeakReference对象来实现软引用,一般在ThreadLocal中,当进行垃圾回收时,被弱引用对象引用的对象就直接被回收.软引用-作用:JVM中使用SoftReference对象来实现软引用,一般在缓存中使用,当程序内存不足时,被引用的对象就会被回收.强引用-作用:可达性算法描述的根对象引用普通对象的引用,指的就是强引用,只要有这层关系存在,被引用的对象就会不被垃圾回收。引用计数法-缺点:如果两个对象循环引用,而又没有其他的对象来引用它们,这样就造成垃圾堆积。
252 0
|
10月前
|
算法 Java 对象存储
JVM深入原理(八)(二):垃圾回收
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为StopTheWorld简称STW,如果STW时间过长则会影响用户的使用。一般来说,堆内存越大,最大STW就越长,想减少最大STW,就会减少吞吐量,不同的GC算法适用于不同的场景。分代回收算法将整个堆中的区域划分为新生代和老年代。--超过新生代大小的大对象会直接晋升到老年代。
250 0
|
10月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
313 0
|
11月前
|
机器学习/深度学习 存储 算法
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
反向传播算法虽是深度学习基石,但面临内存消耗大和并行扩展受限的问题。近期,牛津大学等机构提出NoProp方法,通过扩散模型概念,将训练重塑为分层去噪任务,无需全局前向或反向传播。NoProp包含三种变体(DT、CT、FM),具备低内存占用与高效训练优势,在CIFAR-10等数据集上达到与传统方法相当的性能。其层间解耦特性支持分布式并行训练,为无梯度深度学习提供了新方向。
619 1
NoProp:无需反向传播,基于去噪原理的非全局梯度传播神经网络训练,可大幅降低内存消耗
|
12月前
|
存储 算法 Java
G1原理—6.G1垃圾回收过程之Full GC
本文详细探讨了G1垃圾回收器对Full GC(FGC)的优化处理,涵盖FGC的前置处理、整体流程及并行化改进。重点分析了传统FGC串行化的局限性以及G1通过Region分区和RSet机制实现并行标记的优势,包括任务窃取提升效率、跨分区压缩以生成空闲Region等技术细节。此外,文章还介绍了G1的新特性——字符串去重优化,通过判断char数组一致性减少重复字符串占用内存,从而提升内存使用效率。总结部分全面回顾了G1在FGC中的各项优化措施及其带来的性能改善。
G1原理—6.G1垃圾回收过程之Full GC
|
12月前
|
存储 算法 Java
G1原理—5.G1垃圾回收过程之Mixed GC
本文介绍了G1的Mixed GC垃圾回收过程,包括并发标记算法详解、三色标记法如何解决错标漏标问题、SATB如何解决错标漏标问题、Mixed GC的过程、选择CollectSet的算法
G1原理—5.G1垃圾回收过程之Mixed GC
|
12月前
|
存储 监控 架构师
ZGC圣经:ZGC垃圾回收器的原理、调优,ZGC 漏标的 分析与 研究
ZGC圣经:ZGC垃圾回收器的原理、调优,ZGC 漏标的 分析与 研究
|
12月前
|
存储 算法 Java
G1原理—4.G1垃圾回收的过程之Young GC
本文详细解析了G1垃圾回收器中YGC(Young Generation Collection)的完整流程,包括并行与串行处理阶段。内容涵盖YGC相关参数设置、YGC与Mixed GC及FGC的关系、新生代垃圾回收的具体步骤(如标记存活对象、复制到Survivor区、动态调整Region数量等),以及并行阶段的多线程操作和串行阶段的关键任务(如处理软引用、整理卡表、重构RSet)。
G1原理—4.G1垃圾回收的过程之Young GC
|
12月前
|
存储 缓存 算法
G1原理—3.G1是如何提升垃圾回收效率
本文深入探讨了G1垃圾回收器提升GC效率的核心机制,包括记忆集(RSet)、位图(BitMap)和卡表(CardTable)的设计与作用。记忆集通过记录跨代引用避免了不必要的老年代遍历,位图用于高效描述内存使用状态以优化标记过程,而卡表则在节约记忆集内存的同时提供更详细的引用信息。此外,文章还解析了DCQ(Dirty Card Queue)和DCQS(Dirty Card Queue Set)机制如何异步更新RSet,确保在高并发场景下的性能与准确性。这些设计共同提升了G1在标记、清理及整理内存时的效率。
636 10
|
12月前
|
Prometheus 监控 算法
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究
本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记
CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究