首页 > 编程语言 >Java-Jvm中GC类型及执行时机

Java-Jvm中GC类型及执行时机

时间:2023-12-15 13:14:32浏览次数:34  
标签:Java Generation 回收 GC Jvm 执行 Minor

Java-Jvm中GC类型及执行时机

堆的结构

  1. 年轻代(Young Generation):

    • Eden区: 在年轻代中,对象首先被分配到Eden区。大多数对象很快就会被回收,所以它们被分配到Eden区以提高分配速度。
    • Survivor区(S0和S1): Eden区中存活的对象会被移动到Survivor区。每次发生Minor GC时,存活的对象会被移动到另一个Survivor区。这两个Survivor区之间会进行对象的交换。
  2. 老年代(Old Generation):

    • 老年代: 存放在年轻代中经历多次垃圾回收仍然存活的对象。通常,老年代比年轻代的空间要大,因为存活较长的对象会被转移到老年代。
  3. 永久代(Permanent Generation): (Java 8之前)

    • 方法区(Method Area): 包含类的元数据、静态变量、常量等。在Java 8之前,类的元数据和常量池等信息存储在永久代中。然而,永久代在Java 8中被元空间(Metaspace)取代。
  4. 元空间(Metaspace): (Java 8及之后)

    • 元空间: 用于存储类的元数据,例如类的结构信息、方法信息等。在Java 8及之后,元空间替代了永久代,它的大小不再受到默认或最大堆大小的限制,而是由操作系统的可用内存决定。

GC类型及执行时机

  1. Minor Garbage Collection (Young Generation GC):

    • 执行时机: Minor GC主要发生在年轻代(Young Generation)。它回收年轻代中不再被引用的对象。通常在新生代满时触发,即当Eden区满时,触发一次Minor GC。
    • 执行内容: Minor GC使用复制算法,将存活的对象复制到另一块幸存区(Survivor)或老年代。同时,清理掉不再被引用的对象。这个过程相对较快,因为年轻代的大小通常较小。
  2. Major Garbage Collection (Old Generation GC):

    • 执行时机: Major GC主要发生在老年代(Old Generation)。它回收老年代中的不再被引用的对象。通常是在老年代的空间不足时触发。
    • 执行内容: Major GC使用标记-清除(Mark and Sweep)或标记-整理(Mark and Compact)算法。这个过程相对较慢,因为老年代的大小通常较大。
  3. Full Garbage Collection:

    • 执行时机: "Full GC" 是一个更广泛的术语,它可以包括对整个堆内存的回收,包括年轻代和老年代。有时,"Full GC" 可能指的是同时对年轻代和老年代执行垃圾回收的操作。
    • 执行内容: 在"Full GC"中,整个堆内存都会被回收。这通常包括执行Minor GC和Major GC,可能还包括一些额外的清理工作,例如对永久代(在Java 8之前)或元空间(在Java 8及之后)的回收。

    实际上,不同的垃圾回收器和JVM实现可能有不同的策略和行为。"Full GC"通常是在一些比较特殊的情况下触发的,例如老年代空间不足、永久代(Java 8之前)或元空间(Java 8及之后)溢出等。

标签:Java,Generation,回收,GC,Jvm,执行,Minor
From: https://www.cnblogs.com/anhaoyang/p/gc-type-and-execution-timing-in-javajvm-mogxl.html

相关文章

  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • Java-创建线程池的参数及工作原理
    Java-创建线程池的参数及工作原理常见的参数corePoolSize(核心线程数):线程池中保持的最小线程数,即使它们是空闲的。maximumPoolSize(最大线程数):线程池中允许的最大线程数。keepAliveTime(线程空闲时间):当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新......
  • java: 通过URL读取hadoop HDFS
    packagetju;importorg.apache.hadoop.fs.FsUrlStreamHandlerFactory;importorg.apache.hadoop.io.IOUtils;importjava.io.InputStream;importjava.net.MalformedURLException;importjava.net.URL;importjava.net.URLStreamHandlerFactory;publicclassReadF......
  • java: MappedByteBuffer的用法
    packagenio;importjava.io.RandomAccessFile;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;publicclassMappedByteBufferTest{publicstaticvoidmain(String[]args)throwsException{RandomAccessFilerandomAccessF......
  • java之冒泡排序
    冒泡排序原理:从第一个数开始,和后面一个数比较大小,根据升序或者降序,看是否需要互换位置。每一轮会把1个数罗列到正确位置,经过数组长度-1轮比较,排序完成。比如:对数组{11,55,33,22,44}进行升序排列数组长度是5,需要经过5-1轮,每一轮需要比较5-当前轮次。publicc......
  • 【JAVA】Multiple markers at this line @Override的解决方法
    【未解决】我的是1.8,都显示的是1.8使用Eclipse进行项目开发,在实现类中的方法前面如果添加@Override就提示“Multiplemarkersatthisline”的错误,问题描述如下Multiplemarkersatthisline-ThemethodgetStudentByID(String)oftypeStudentBeanImplmustoverridea......
  • Java-Redis是如何保证高可用的?
    Java-Redis是如何保证高可用的?​​高性能基于内存的存储Redis是基于内存的存储系统,所有数据都保存在内存中,这使得Redis可以快速读取和写入数据。与传统的基于磁盘存储的系统相比,Redis的读写性能更高。单线程的设计是单线程的设计,所有的读写请求都由同一个线程处理,避免了多线......
  • JavaWeb - Day08 - MySQL - 多表查询、事务、索引 - Mybatis - 入门
    01.MySQL-多表查询-概述数据准备#建议:创建新的数据库createdatabasedb04;usedb04;--部门表createtabletb_dept(idintunsignedprimarykeyauto_incrementcomment'主键ID',namevarchar(10)notnulluniquecomment'部门名称',......
  • Java-常见的排序算法有哪些
    Java-常见的排序算法有哪些比较排序算法:冒泡排序(BubbleSort):过程:从左到右依次比较相邻的元素,如果顺序不对就交换它们,一轮比较会将最大的元素冒泡到末尾。优势:简单易懂,对于小型数据集表现较好。劣势:时间复杂度为O(n^2),性能相对较差。插入排序(InsertionSort):过......