垃圾回收概念和算法

JVM调优简单理解:CSDN

什么是垃圾:GC中的垃圾指存在于内存中,不会再被使用的对象

GC处理流程

  1. 对象实例化需要依据关键字new完成,所有新对象都会在伊甸园区开辟,如果伊甸园区的内存空间不足会发生MinorGC。Member mem = new Member(),很小,直接保存在伊甸园;
  2. 伊甸园区不是无限大的,所以肯定有些对象执行了N次的MinorGC后还会存在,那么这些对象将进入到存活区(存活区有两个,一个负责保存存活对象,一个负责晋升(将对象复制到老年代),永远都有一个空内存);
  3. 如果经历过若干次的MinorGC回收处理之后发现空间依然不够使用的,那么则进行老年代的GC回收,执行了一个MajorGC(Full GC,性能很差),如果可以回收空间,则继续进行MinorGC;
  4. 如果MajorGC失败,则继续内存已经占用完满,则抛出OOM异常(out of memory);
  5. 如果新创建的对象的空间占用过大将被直接保存到老年代之中。

JDK1.8 会根据系统硬件不同自动选择不同的GC回收策略

  • 单核CPU -》串行回收器
  • 多核CPU -》并行回收器

补充:      JDK8使用 G1 :-XX:+UseG1GC        JDK11 开始默认使用 G1 回收器

内存分配策略:
        1)对象优先在 Eden 分配
        2)大对象直接进入老年代
        3)长期(默认最大15次MinorGC)存活的对象进入老年代

年轻代回收算法

  • 复制清理算法:将保留的对象复制到存活区之中,存活区的内容会保存到老年代之中CSDN
  •   Eden 区总是会有大量的对象产生,所有 HotSpot 虚拟机使用了BTP (单一CPU时代所有的对象依次保存)TLAB (拆分为不同的块,依据CPU的核心个数拆分)

            技术形式

老年代回收算法

  • 标记-清除算法:先进行对象的第一次标记,在这段时间之内会暂停程序的执行(STW)(如果标记的时间长或者内容过多),这个暂停时间就会越长就会产生串行标记、并行标记使用问题
  • 标记-压缩算法:基于 标记-清除 算法,将零散的内存空间进行整理重新集合再分配

垃圾回收器

  • 作用

  1. 分配内存:垃圾回收算法的设计往往制约了内存分配的方式

  2. 确保存活对象不会被回收

  3. 回收垃圾对象

        

  • 分类

    • 年轻代 : MinoirGC

      • 串行GC:Serial

      • 并行GC:ParNewGC

      • 并行回收GC:PS

    •  老年代

      • 串行GC:Serial

      • 并行GC:ParNewGC

      • 并发GC:CMS( - STW  暂停问题)

                
从JDK8 开始提供有 G1 收集器,从JDK11 又新增了两个收集器:G1 是默认回收器  ZGC:仅仅支持 Linux 64 位
            
G1 回收器:分区(某一区出现问题时不会影响整体的运行)支持大内存(4G-64G)、多CPU、减少SWT停顿时间,可以保证高并发状态下的程序执行
            

为了提高JVM性能,减少GC开销的措施?
        1)不要显示的使用 System.gc()
        2)尽量减少临时对象的使用
        3)对象不用时,最好显示设置为 null
        4)尽量使用 StringBuffer,而不是使用 String 来累加字符串
        5)能使用基本类型的int,long,就不要使用包装类
        6)尽量少用静态对象变量,静态变量是全局的,不会被GC回收,会一直占用内存
        7)...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值