JVM基础知识(马)

GC的基础知识

1.什么是垃圾

有一个对象,没有任何的引用指向它,这个对象所占用的内存就是垃圾

在这里插入图片描述

从栈空间没有任何的引用指向循环的对象 || 循环引用 (一堆垃圾)
在这里插入图片描述

C语言申请内存:malloc free

C++: new delete

Java : new

自动内存回收,编程上简单,系统不容易出错。手动释放内存容易出两种错误

  1. 忘记回收
  2. 多次回收

2.如何定位垃圾

  • 引用计数 (无法解决循环引用的问题,容易导致内存泄漏)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LkbSfVvq-1624845013262)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220133444367.png)]

  • Root Searching (根可达算法 // 根搜索)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmwXfjcr-1624845013268)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220134109003.png)]

3.常见的垃圾回收算法

  1. 标记清除 - 位置不连续,产生碎片
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEyPa3pW-1624845013269)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220135125260.png)]

  2. 拷贝算法 - 没有碎片,浪费空间
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TqX7QIr5-1624845013270)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220135156172.png)]

  3. 标记压缩 - 没有碎片,效率偏低
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbIJAMcW-1624845013271)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220135229175.png)]

效率低的原因:

找垃圾,所有的算法效率都是一样的。
重点是找到垃圾后进行整理的过程:
	1.对于拷贝来说,内存的拷贝速度是非常快的,就是一个线性地址的拷贝
	2.对压缩来说,任何一块内存的移动,对于多线程来说,都需要进行线程同步;如果是单线程,单线程效率本来就低。

一个对象从出生到消亡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3dHjFas-1624845013271)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221165128555.png)]

4.JVM内存分代模型(用于分代垃圾回收算法)

  1. 部分垃圾回收器使用的模型

  2. 新生代 + 老年代 + 永久代 (1.7) / 元数据区(1.8) Metaspace

    1. 永久代 元数据 - Class
    2. 永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于物理内存)
    3. 字符串常量 1.7 - 永久代, 1.8 - 堆
    4. MethodArea逻辑概念 - 永久代 , 元数据
  3. 新生代 = Eden + 2个suyivor区

    1. YGC回收之后,大多数对象会被回收,活着的进入s0

    2. 再次YGC,或者的对象eden + s0 -> s1

    3. 再次YGC,eden + s1 -> s0

    4. 年龄足够 - > 老年代 (15 CMS 6)

    5. s区装不下了(装不下的过去) -> 老年代

      PS + PO --> 15次

      CMS --> 6次

      新生代大小默认8:1:1,可以调整

  4. 老年代

    1. 顽固分子
    2. 老年代满了 FGC Full GC

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXy5CNqH-1624845013273)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221165813254.png)]

  5. GC Tuning(Generation)

    1. 尽量减少FGC
    2. MinorGC = YGC
    3. MajorGC = FGC

5.常见的垃圾回收器(到JDK13,常见的有10种)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9dm5Zyo-1624845013274)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210220164918252.png)]

  1. Serial 年轻代 串行回收 (单线程垃圾回收)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4N54W1fj-1624845013275)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221160254355.png)]

  2. ParNeW 年轻代 配合CMS并行回收(2的衍生,用于配合CMS)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hs0nkVlX-1624845013275)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221160527997.png)]

  3. Parallel Scavenge 年轻代 并行回收 (多线程垃圾回收)
    在这里插入图片描述

  4. SerialOld

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZqGXRTRI-1624845013276)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221161012596.png)]

  5. ParallelOld

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7TdzLjXW-1624845013277)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221161041105.png)]

  6. CMS(垃圾回收和应用程序同时进行,降低STW的时间【200ms】) 老年代 并行回收

    在这里插入图片描述

  7. G1(10ms)

  8. ZGC(1ms) PK C++

  9. Shenandoah

  10. Eplison

1.8默认的垃圾回收【大多数调优:1,2,4,5】: PS + ParallelOld

6.JVM调优第一步,了解生产环境下的垃圾回收器组合

  • JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

  • JVM参数分类

    ​ 标准:- 开头,所有的HotSpot都支持

    ​ 非标准:- X 开头, 特定版本HotSpot支持特定命令

    ​ 不稳定: - XX 开头, 下个版本可能取消

    -XX:+PrintCommaandLineFlags

    查询 -XX开头的参数

    ​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRhsSMVu-1624845013278)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221162734551.png)]

7.三色标记法

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5WbqRHx-1624845013278)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221225038939.png)]

并发标记的两种情况

  • ​ 一个对象被GC认为不是垃圾,但是随着业务进行,变成垃圾
    • 浮动垃圾 floating garbage
    • 下次清除
  • 一个对象被GC认为是垃圾,随着业务进行,又变成不是垃圾了
    • 缓存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhgJ2EOx-1624845013279)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232811974.png)]

漏标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNasOKKa-1624845013280)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232844852.png)]

解决方案

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keqgAzzz-1624845013280)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232928876.png)]

并发标记:产生漏标

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1qOEefr-1624845013281)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221233017921.png)]

解决方案
  • 在重新标记阶段,从头来一遍标记(从新开始一遍),解决漏标
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值