JVM理解

一、垃圾回收算法

1 标记清除法:把垃圾标记下来,并清除。缺点:浪费空间、碎片化。
2 拷贝算法:效率高,连续清除内存。缺点:浪费空间
3 标记整理:把垃圾清理掉后,把有用的给排序一下。缺点:效率太低了

二、内存管理模型

1.分代模型:内存一分为二(年轻代(伊甸区、幸存者区)、老年代、元空间)
2.分区模型:把空间分成一个一个小格

三、垃圾回收器(https://blog.csdn.net/qq_45432665/article/details/115360195):

在这里插入图片描述
1.种类:有10种
ParNew(Yong):
CMS(Old):可处理内存20个G(使用比较少),主要用户Old,调优比较复杂,在1.9是默认使用CMS。使用的是三色标记法
浮动垃圾:标记为垃圾但是未清除上升,碎片化严重。
Serial[se ver o](Yong):处理内存几十M
SerialOld(Old):
ParallelScavenge(Yong):处理内存百M-几个G
ParallelOld[pai er le](Old):
G1(jdk1.8):如果内存大,建议使用G1,处理内存可达上百个G。也是使用三色标记法(SATB),G1将内存划分为大小一致(1M ~ 32M)的小块内存,
我们称每块内存为region。这些region可以属于不同的内存分代,可以是老年代、Eden区、Survivor区,或者是H区用来代表大对象。
在这里插入图片描述
Rset:也叫Remembered Set(记忆集),每个region都有一个RSet,记录着有哪些region中有引用指向本region中的对象。
这个set可以有效提高垃圾回收的效率。
处理时间:可设置到200毫秒。
ZGC:(jdk版本11以上)处理内存可达4个T,jdk13扩展到了16个T。颜色指针,处理时间可设置为10毫秒。ZGC的指针64位
Shenandosh:
Epsilon:
1.1:jdk版本对应的GC回收器
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代)
jdk1.9 默认垃圾收集器G1
2.线程晋升:首先对象在新生代(在新生代种使用的清除算法:复制算法)诞生,执行回收一次就老一岁,
到一定的次数就进入老年代(在老年代种使用的清除算法:标记算法)。
在这里插入图片描述
3.注意事项:Survivor:垃圾回收器执行区域,所有线程将全部终止。
4.对象创建空间申请的流程:
当创建一个新对象的时候需要为新对象申请空间,在伊甸园区申请,但是需要判断伊甸园区的空间是否充足,充足则申请成功。
如果不充足则触发MinorGC回收不活跃的对象(不经常使用的对象),回收之后再判断伊甸园区空间是否充足?
|-充足则申请成功,对象也创建成功
|-如果依然不充足,则判断存活区空间是否充足?
|-如果存活区充足则将伊甸园区的部分活跃对象移到存活区,伊甸园的空间申请成功。
|-如果存活区的空间不足则判断老年代空间是否充足?
1-充足则将存活区的部分活跃对象移动到老年代,之后将伊甸园区的活跃对象保存到存活区,空间申请成功。
|-如果老年代的空间不充足则触发Full GC (MajorGC) 对堆区进行
完全彻底的垃圾回收,之后再判断老年代的空间是否充足,充足则将存活区的活跃对象移到老年代,再将伊甸园区的活跃对象移到存活区,
空间申请成功。如果触发FullGC之后老年代的空间依然不足则会出现00M(OutOf Memory) 错误。
5.jdk版本默认垃圾回收器:
1.8:pc(ParNew + CMS)、ps(ParNew + SerialOld)
1.9:G1
11:ZGC

四、三色标(白色:从未找过、灰色:找到了,但是未找到其子对象、黑色:所有对象都找完)记算法:

1.工作介绍:标记一半没有标记完,回来再标记(工作分为多个线程标记,每个线程只标记一点,多个线程把一个对象标记完成。)
2.三色表记法解释:存储代表状态的标记,并不是实际的颜色。
3.三色标记会出现的问题:当找到一个对象为黑色的时候,突然这个对象多了一个白色对象引用,这个对象不能删,删除会报空指针,
但是也不能是黑色;解决:将这个对象改为灰色;
4.采用此算法的垃圾回收器:CMS(存在的大BUG,会出现漏标,解决就是当找完对象树之后再对对象树进行一次垃圾回收操作,
此时所有的线程将被停止,此方法在stw[Stop The World])

五、jvm-start-drill

打开命令窗口,输入:java。出现的以横杠开头的都是标准参数。
查看jvm参数:
1.以-X开头都是非标参数。命令:java -X。
2.查看所有jvm参数:java -XX:+PrintFlagsInitial,将所有参数保存到记事本:java -XX:+PrintFlagsInitial >>1.txt
各垃圾回收器调优的常用参数:
https://www.cnblogs.com/yanchuanbin/p/14755927.html
PS与PO调优参数:
在这里插入图片描述
CMS参数调优
在这里插入图片描述
G1参数调优
在这里插入图片描述

六、内存溢出的方法

public static void main(String[] args) {
List list = new ArrayList();
for (;😉{
byte[] bytes = new byte[1024*1024];
list.add(bytes);
}
}

七、调优工具 Arthas

八、jvm的实现:

1.oracle:openJDK
2.IMB:J9 VM

九、JVM概念:

JIT(just-in-time compilation):狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。当虚拟机发现某个方法或代码块的运
行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进
行各种层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler,下文统称JIT编译器)。

十、JVM图示

在这里插入图片描述
在这里插入图片描述
JVM结构执行流程图:
在这里插入图片描述

对象:都有一个对象头
java指针:
T t = new T(); 其中t就是指针,执行堆中的一个地址

十一、JVM源码

jdk的目录结构及结构图
在这里插入图片描述

十二、类装载 > JVM模型 > 类执行 图示

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值