JVM堆内存的结构,YGC,FGC的原理

JVM堆内存结构:
JVM堆内存可分为三个区域:新生代(Young Generation)、年老代(Tenured Generation,也叫做Old Generation)和永久代(Permanent Generation,也叫做Method Area)。其中,新生代又分为一个Eden区和两个Survivor区。

Eden区:是新生代中对象最初被创建的地方。当新创建一个Java对象时,该对象会被分配在Eden区。如果Eden区无法容纳新创建的Java对象,就会触发一次Minor GC(年轻代垃圾收集),将Eden区和Survivor区中没有被引用的对象清除,而仍存活的对象则会被移至Survivor区。

Survivor区:当Java对象在Eden区中经过一次Minor GC后,如果在Survivor区中已经存在一份相同的对象,就会将该对象复制到Survivor区,同时更新该对象的引用计数器。Survivor区是一块大小较小的区域,通常分为两个大小相等的区域。每次Minor GC后,Survivor区中存活的Java对象都会被复制到另一个空区,同时清空这个区域。Survivor区的主要作用是存放年轻代中从Eden区中被复制过来的存活对象,以及在Minor GC时被转移到另一个Survivor区中的存活对象。

年老代:当Java对象在Survivor区中经过多次复制后仍然存活,它们就会被晋升到年老代。年老代是专门存放Java长生命周期对象的区域,因此也被称为Old Generation。当年老代区域无法容纳新创建的Java对象时,就会发生一次Full GC(全局垃圾收集),将整个堆内存中无用的对象都清除掉。

永久代:是一块专门存储Java类(Class)信息的区域,也被称为Method Area。在Java 8及以后的版本中,永久代已经被Metaspace取代。

YGC和FGC的原理:
在Java的内存管理中,每一次GC都有一个主要的目标,就是清除无用的对象,重新回收内存空间。另外,JVM的内存管理还存在一些通用的策略,比如对象的创建、移动和回收等。

YGC(年轻代GC):
在JVM中,当Eden区和Survivor区中没有存活对象时,就会进行一次YGC。YGC的主要目标是清除年轻代中的无用对象,将存活对象移动到Survivor区。在经过一定时间和一定次数的YGC后,年轻代中的存活对象会被晋升到年老代。这是因为年老代中的对象生命周期较长,因此在Full GC时才会被收集。

FGC(Full GC):
在JVM中,当年老代区域无法容纳新创建的Java对象时,就会发生一次Full GC,将整个堆内存中无用的对象都清除掉。Full GC清理的对象范围包括年轻代、年老代和永久代。Full GC会带来较长的停顿时间,因此需要尽可能地避免触发Full GC。

总结:
YGC主要是针对年轻代和Survivor区进行垃圾回收的,而FGC则是对整个堆内存进行垃圾回收的。它们的共同目标都是将无用的对象从内存中清理出去,释放内存空间,以便程序能够更加高效地运行。

相关推荐

  1. JVM结构,YGC,FGC原理

    2024-07-15 20:20:04       21 阅读
  2. 分区

    2024-07-15 20:20:04       34 阅读
  3. 第七讲 对象基本组成-引用-栈内存-

    2024-07-15 20:20:04       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 20:20:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 20:20:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 20:20:04       57 阅读
  4. Python语言-面向对象

    2024-07-15 20:20:04       68 阅读

热门阅读

  1. Spring boot 2.0 升级到 3.3.1 的相关问题 (二)

    2024-07-15 20:20:04       21 阅读
  2. LeetCode题练习与总结:寻找峰值--162

    2024-07-15 20:20:04       17 阅读
  3. Mysql数据库(一)

    2024-07-15 20:20:04       25 阅读
  4. (leetcode学习)16. 最接近的三数之和

    2024-07-15 20:20:04       19 阅读
  5. /EtherCATInfo/Descriptions/Devices/Device/SubDevice/@Hideable

    2024-07-15 20:20:04       16 阅读
  6. 零基础自学爬虫技术该从哪里开始入手?

    2024-07-15 20:20:04       19 阅读
  7. FeignClient详解

    2024-07-15 20:20:04       21 阅读
  8. 【经验】LiveData使用常见问题

    2024-07-15 20:20:04       21 阅读
  9. A2A VPN简介

    2024-07-15 20:20:04       20 阅读
  10. c++多态详细学习

    2024-07-15 20:20:04       16 阅读