JVM_FullGC&YoungGC

概念

JVM是Java Virtual Machine(Java虚拟机)的缩写;
JVM 中的 GC(Garbage Collection)是垃圾回收的缩写,是 JVM 的内存管理机制。
Young GC 和 Full GC 是两种不同的 GC 算法。

当新生代内存不够用时,Young GC 会发生,本质上 Young GC 可以理解成 jvm 正常的扫垃圾过程;所以,YoungGC的出现是属于正常情况,

Full GC, 即全垃圾回收,是一种垃圾回收的过程 , 它会暂停所有的应用程序线程,对整个堆进行回收。 FullGC的出现,就叫事故了,这种对业务影响很大的。
Full GC 是 Full Garbage Collection 的缩写,是指把整个堆内存扫描一遍,回收不再使用的对象并且整理内存的过程。由于堆内存的整体回收过程非常慢,因此,Full GC 可能导致应用程序的暂停。
Full Gc 本质上就是,垃圾太多,正常的活儿干不了了,内存空间不够了,得停下所有的事情,来一次大扫除

要避免 Full GC 发生,需要运维调整堆内存大小:确定合适的堆内存大小是避免 Full GC 发生的关键。以及减少数据对象的生命周期:尽可能地缩短对象的存活时间。

 

什么情况下会发生Full GC?

Full GC 它会清理整个堆内存,包括新生代和老年代。Full GC通常发生在以下情况下:

  1. 老年代空间不足: 当老年代无法容纳新生代晋升过来的对象时,可能触发Major GC。这通常发生在年轻代的Minor GC后,存活的对象被移动到老年代,导致老年代的空间不足。
  2. 永久代空间不足: 在Java 7及之前的版本中,常量池等信息存放在永久代中。如果常量池或类的元数据占用的空间过大,可能导致永久代空间不足,触发Full GC。在Java 8及之后的版本中,永久代被元空间(Metaspace)取代。
  3. 使用CMS(Concurrent Mark-Sweep)垃圾回收器时的并发失败: CMS是一种以减少应用程序停顿时间为目标的垃圾回收器,但它可能会因为一些原因(比如老年代空间不足)而导致并发失败,从而触发Full GC。
  4. System.gc()的显式调用: 调用System.gc()Runtime.getRuntime().gc()并不能确保会立即进行垃圾回收,但它可能会触发Full GC。
  5. 永久代/Metaspace溢出: 如果Metaspace(Java 8及以后的版本)或永久代(Java 7及之前的版本)中的元数据信息溢出,可能触发Full GC。
  6. 分配担保失败: 在进行Minor GC时,虚拟机会检查老年代的剩余空间是否大于新生代的对象总大小。如果不大于,会尝试进行一次Full GC。这是为了确保在新生代GC后,存活的对象能够顺利晋升到老年代。
  7. G1垃圾回收器的一些特殊情况: G1垃圾回收器在一些特殊情况下可能触发Full GC,例如在进行Mixed GC(混合收集)时,或者由于空间不足而放弃Mixed GC,转而执行Full GC。

ARMS监控JVM

阿里云的ARMS(应用实时监控服务)提供了对JVM(Java虚拟机)的监控功能,允许用户实时查看JVM的运行状态和相关指标。以下是如何使用ARMS监控JVM的步骤:

  1. 登录ARMS控制台。
  2. 在左侧导航栏选择应用监控 > 应用列表,并在顶部菜单栏选择目标地域。
  3. 在应用列表页面单击接入应用,并选择目标应用。
  4. 在应用详情页面选择想要查看的实例,并在页面右侧单击JVM监控页签。

在JVM监控页签内,你可以查看以下JVM监控指标:

  • GC瞬时次数和GC瞬时耗时:这反映了垃圾回收的次数和耗时,有助于了解垃圾回收对应用性能的影响。
  • 堆内存详情:包括已使用、已提交和最大堆内存的大小,反映了Java应用的内存使用情况。
  • 元空间详情:用于存放类的元数据,包括类的结构信息、方法信息、字段信息等,这一部分的内存占用一般比较稳定。
  • 非堆内存:ARMS展示的非堆内存包括元空间(Meta Space)、压缩类空间(Compressed Class Space)和代码缓冲区(Code Cache)三个区域的总和。这反映了JVM中非堆内存的使用情况。
  • 直接缓冲区:用于NIO操作的内存区域。
  • JVM线程数:当前JVM的线程数量。

你可以通过单击各个监控面板上的指标名称,打开或关闭该指标在图表中的可见性。另外,你还可以单击“查看API”按钮,查看该监控指标的API详情。

请注意,为了使用ARMS的JVM监控功能,你可能需要先将你的Java应用接入ARMS。具体的接入步骤可能包括下载并安装Agent,然后在应用中配置相应的参数。详细的接入步骤和配置方法,你可以参考阿里云的官方文档或相关教程。

通过ARMS的JVM监控功能,你可以实时了解Java应用的内存使用情况和性能表现,从而及时发现并解决问题,提升应用的稳定性和性能。

posted @ 2024-04-28 14:14  xiaodi888  阅读(79)  评论(0编辑  收藏  举报