JVM复习

本文详细介绍了JVM的启动流程、基本结构,包括PC寄存器、方法区、Java栈,以及重点讲解了JVM内存模型中的Volatile变量的可见性保证。同时,探讨了GC(垃圾收集)的概念,分析了不同GC算法如标记-清除、标记-压缩、复制算法的优缺点,并引入了分代收集思想以及不同GC收集器的特点,如串行、并行和CMS收集器的工作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、JVM启动流程

这里写图片描述

2 、JVM基本结构
这里写图片描述
PC寄存器
– 每个线程拥有一个PC寄存器
– 在线程创建时 创建
– 指向下一条指令的地址
– 执行本地方法时,PC的值为undefined
方法区
– 保存装载的类信息
类型的常量池
字段,方法信息
方法字节码
– 通常和永久区(Perm)关联在一起
Java栈
– 线程私有
– 栈由一系列帧组成(因此Java栈也叫做帧栈)
– 帧保存一个方法的局部变量、操作数栈、常量池指针
– 每一次方法调用创建一个帧,并压栈

JVM的内存模型
这里写图片描述

Volatile 变量:一个线程修改了变量,其他线程可以立即知道
保证可见性的方法
– volatile
– synchronized (unlock之前,写变量值回主存)
– final(一旦初始化完成,其他线程就可见)

GC的概念 垃圾收集。Java中GC的对象是堆空间和永久区.
GC 算法 :
标记-清除: 标记-清除算法是现代垃圾回收算法的思想基础。标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。

缺点: 产生的内存碎片较多。

标记-压缩: 算法适合用于存活对象较多的场合,如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。之后,清理边界外所有的空间。

复制算法:
与标记-清除算法相比,复制算法是一种相对高效的回收方法
不适用于存活对象较多的场合 如老年代
将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收

最大的缺点 空间浪费 整合标记清理思想

这里写图片描述

较大的对象和存活时间长的对象 直接进入老年代,然后在进行复制,清理。

分代思想:
依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。
根据不同代的特点,选取合适的收集算法
– 少量对象存活,适合复制算法
– 大量对象存活,适合标记清理或者标记压缩

GC收集器:
1 串行收集器 :最古老,最稳定
效率高
可能会产生较长的停顿
2 并行收集器: 并发 需要多线程支持
3 CMS 收集器 :
CMS运行过程比较复杂,着重实现了标记的过程,可分为
初始标记
根可以直接关联到的对象
速度快
并发标记(和用户线程一起)
主要标记过程,标记全部对象
重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
并发清除(和用户线程一起)
基于标记结果,直接清理对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值