JVM(基础知识,垃圾回收)

JVM

左边的书权威存在
在这里插入图片描述

JVM基础知识

在这里插入图片描述

主力机型

平时所用的虚拟机就是HotSpot
在这里插入图片描述

关键点:热点代码探测能力
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

体系结构

类加载子系统,执行引擎,运行时数据区
在这里插入图片描述

线程隔离的区域,有一个线程就要创建一个区域
垃圾回收就是要回收被共享的区域
在这里插入图片描述

运行时数据区

程序计数器:字节码的行号指示器,每一个线程都有一个独立的程序计数器
在这里插入图片描述

在这里插入图片描述

本地方法栈只能执行本地方法(native)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

对象如何存放

类的创建过程
1.首先检查在常量池中是否有这个类的符号引用(类是用符号代替的);如果没有,要进行类加载,从磁盘(网络、jar包、数据库)加载到方法区中
2.给对象分配内存,在堆中划分这个内存块
3.初始化零值
4.为对象设置必要的信息
5.执行<init>()方法,相当于对象的构造器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在并发的时候有学过
在这里插入图片描述

会将长度相同的字段放一起,容易对齐,好管理
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

垃圾回收机制

在这里插入图片描述

在这里插入图片描述

循环引用:对象A引用对象B,对象B引用对象A,互相引用,虽然都已经死了,但是引用计数都不是0,会造成内存泄漏(也就是这块内存无法使用了)
在这里插入图片描述

例子

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

可以作为GC Roots的对象,列举几个即可
在这里插入图片描述

强弱是指垃圾回收的角度,什么情况下能被垃圾回收
在这里插入图片描述

虚引用相当于只是一个标识
在这里插入图片描述

每个对象没有引用了,并不是立即死亡,而是有一个自我救赎的机会,但救赎的机会只能有一个次,需要代码实现,但是这个机制不推荐使用
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

垃圾回收算法

针对不同生存周期的对象,做不同的垃圾回收算法

跨代引用是说朝生夕灭的对象和难以消亡的对象之间的引用
跨代引用一般会将引用变成第二类
绝对多数情况下是同代引用
在这里插入图片描述

在这里插入图片描述

这里MajorGC有时候也指整堆收集
在这里插入图片描述
在这里插入图片描述

标记清除算法

关键:空间碎片化
在这里插入图片描述

在这里插入图片描述

标记复制算法

分区->标记->复制->清除
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

标记整理算法

标记->移动->清除
在这里插入图片描述

在这里插入图片描述

经典的垃圾回收器

在这里插入图片描述

爆炸的符号表示JDK9中不让这样搭配了
在这里插入图片描述

Serial

这里的Safepoint安全点是一个垃圾回收的标识,当所有线程跑到这个点,再开始垃圾回收
在这里插入图片描述
在这里插入图片描述

ParNew

在这里插入图片描述

CMS成就了ParNew(Serial 也可以搭配CMS,但是是单线程的,还不如用ParNew)
在这里插入图片描述

Parallel Scavenge

提高吞吐量和尽可能缩短垃圾收集停顿时间有什么区别?
虽然说CMS是尽可能缩短停顿时间,每次垃圾回收就一小会,但是会多次停顿,比较频繁,这样用户体验会比较好,但总体的停顿时间并不少
但是这个收集器是为了能效,很明显不是用于web服务,而用于后台运算之类的
在这里插入图片描述

在这里插入图片描述

Serial Old

在这里插入图片描述

Parallel Old

在这里插入图片描述

CMS

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这里为什么预留一部分空间,老师这里讲的是因为需要给新生代的收集器分配担保,如果新生代存活对象多的话,可能会需要分配担保
但是我觉得这并不是区别于其他老年代收集器的原因,因为其他收集器我感觉也要分配担保啊
这里提到的是,需要预留空间给并发收集时的程序运作使用,意思应该是说并发收集时的时候,会有老年代的对象会被程序分配,所以需要给这些对象预留空间
但是不可能刚开始就创建一个老年代的对象吧,需要晋升,所以这里应该指的是在这一次执行过程中晋升的对象填进了老年代的空间里。而其他收集器在收集老年代垃圾的时候都是单独占用堆内存的,并不会有对象在这个过程中晋升,所以预留空间小点就可以
这里没搞太明白,完了补充!
在这里插入图片描述
在这里插入图片描述

G1

衡量标准变成了哪个内存空间垃圾最多,回收收益最大,就回收哪个
在这里插入图片描述

大对象直接进入老年代
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

记忆集是什么,卡表,索引号是什么?
在这里插入图片描述

增量更新算法?原始快照算法?三色标记法(后面补充了)
对于标记过程中发生的引用变化 (可能导致标记缺失 不是垃圾的被判断为垃圾) 为了解决这个问题 cms采用增量更新算法 g1采用快照
在这里插入图片描述

在这里插入图片描述

三个问题:跨区域引用怎么搞?在并发标记的时候,用户线程对我产生了干扰,怎么办?怎么预测回收这个空间有多少收益、需要停顿多久?

在这里插入图片描述

在这里插入图片描述

总体来说将内存的空间管理的比较好
在这里插入图片描述

在这里插入图片描述

这里应该是标记整理
在这里插入图片描述

补充:
在这里插入图片描述

在这里插入图片描述

三色标记法

三色标记法
链接:https://blog.csdn.net/Gui_yunuo/article/details/106720168
这个方法主要是处理对象的标记问题,用三种颜色的标记来表示对象以及其引用对象是否已经被检查过了
但是在并发标记的过程中,可能会出现检查过的对象引用被修改指向一个未被检查过的对象,这个未被检查过的对象的引用恰好也断开了(具体链接文章里有),意思就是说,可能有一个对象是有引用的,但是却因为没有扫描到而要被垃圾回收
为了解决这个问题,cms采用的是增量更新算法,g1采用的是快照
增量更新就是说,把增加引用的对象重新标记为灰色
快照就是说,如果把灰色标记对象的引用删除了,就把这个引用推给GC的堆栈,让它还可以找到这个引用
前者用在CMS上,后者用在G1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值