GC和GC Tuning 垃圾回收

GC基础知识

1、什么是垃圾

没有任何引用指向的一个对象或者多个对象
C语言中申请内存:malloc free
c++:new delete

java:new
自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型问题:
1、忘记回收
2、多次回收

2、如何找到垃圾

1、引用计数(有缺陷,不能解决循环引用)
2、根可达算法
哪些对象是根对象呢?
根线程变量、静态变量、常量池、JNI指针
从根找不到的 都是垃圾,和根有联系的就不是垃圾

3、常见的垃圾处理方法

1、标记清除 Mark-Sweep
碎片化,位置不连续

2、拷贝算法
没有碎片,浪费空间,位置连续

3、标记压缩 Mark-Compact
效率低

JVM内存分代模型

1、在部分垃圾回收器使用的模型
2、新生代 new + 老年代 old + 永久代(1.7)/元数据区(1.8)

  • 永久代:元数据-Class

  • 永久代必须指定大小限制,元数据可以设置,无上限

  • 字符串常量 jdk1.8版本存在 堆里面
    3、新生代 = Eden + 2个survivor区:
    YGC回收之后,大多数的对象都会被回收,或者的进入s0
    再次TGC,活着的对象Eden+ s0 —> s1
    再次TGC,Eden + s1 ----> s0
    年龄足够–>老年代(15 或者 16 )
    s区装不下 就 扔给老年代
    1.YGC和FGC是什么

    YGC :对新生代堆进行gc。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。

    FGC :全堆范围的gc。默认堆空间使用到达80%(可调整)的时候会触发fgc。以我们生产环境为例,一般比较少会触发fgc,有时10天或一周左右会有一次。

2.什么时候执行YGC和FGC

a.edn空间不足,执行 young gc;

b.old空间不足,perm空间不足,调用方法System.gc() ,ygc时的悲观策略, dump live的内存信息时(jmap –dump:live),都会执行full gc
堆内存逻辑分区

在这里插入图片描述
4、老年代

  • 1.包含 顽固分子
  • 2.老年代满了FGC
    5、GC Tuning
  • 尽量减少FGC
  • MinorGC = YGC
  • MajorGC = FGC

垃圾回收器

在这里插入图片描述

Serial(串行)单线程

  1. Serial 年轻代 串行回收,一个线程进行垃圾回收

java程序运行会产生卡顿现象就是因为 STW
在这里插入图片描述

Eden区的对象满了,STW(stop the world),让singleGC上场,指向垃圾回收,执行完之后,你再继续运行

PS 年轻代 并行回收

  1. 并行回收,多个线程同时进行垃圾回收,效率比单线程要高
    在这里插入图片描述

parnew :配合CMS的并行回收

在这里插入图片描述

ConcurentMarkSweep

CMS:并发的

非常复杂
在垃圾回收的时候也同时进行应用程序,降低STW的时间(200ms)

在这里插入图片描述

在CMS之后诞生了

G1 (STW:10ms)

ZGC(STW :1ms)

我们就只对下面几个垃圾回收器进行调优,因为这是默认的垃圾回收器

1.8 默认的垃圾回收: PS + ParallelOld
在这里插入图片描述

-XX :+ PrintCommandLineFlags

-XX:+PrintFlagsFinal 最终参数值
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值