JVM知识点汇总
2023-02-12 17:34:29 0 举报
AI智能生成
jdk基础知识点处理
作者其他创作
大纲/内容
基础
jdk、jre、jvm
jdk(JavaSE development kit)
jvm (Java Virtual Machine)
jre(Java runntime Enviroment)
class 类的生命周期
加载
1、获取二级制文件字节流。从磁盘上找到文件
2、将文件静态存储结构转换为运行时数据区结构
3、生成class文件,找到访问入口
2、将文件静态存储结构转换为运行时数据区结构
3、生成class文件,找到访问入口
链接(验证、准备、解析)
验证:
1、文件格式验证,指字节码是否以魔数 0xcafebaby开头
2、元数据验证:符合java语言规范的元数据
3、字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如保证跳转指令不会
跳转到方法体以外的字节码指令上。
4、符号引用验证:保证符号引用(字节码指令)可以转换为直接引用(真实的地址)
1、文件格式验证,指字节码是否以魔数 0xcafebaby开头
2、元数据验证:符合java语言规范的元数据
3、字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。例如保证跳转指令不会
跳转到方法体以外的字节码指令上。
4、符号引用验证:保证符号引用(字节码指令)可以转换为直接引用(真实的地址)
准备:分配内存,赋值初始化的过程 此时赋值为默认的初始值,并不是真正意义上的自定义的值
解析:符号引用转化直接引用
初始化
给静态变量初始化自定义值的过程
使用
对象实例化的过程
卸载:可以理解为GC
class 被回收必须要要满足的三个条件:
1、所有实例对象都被GC
2、classLoader都已经被GC的时候
3、.class对象没有被引用或者说没有静态方法、静态变量被引用的时候
1、所有实例对象都被GC
2、classLoader都已经被GC的时候
3、.class对象没有被引用或者说没有静态方法、静态变量被引用的时候
jvm内存模型
线程私有的
程序计数器(The pc Register)
本地方法栈(Native Method Stacks)
java 虚拟机栈(虚拟机栈)
可以理解为一个先进后出的队列
队列中的元素由栈帧构成
队列中的元素由栈帧构成
栈帧的构成
局部变量表
操作数栈(主要负责计算指令的调度)也可以理解为cpu
动态链接
方法返回地址
线程共享的
方法区(Method Area)也可以叫做永久代,还可以成为非堆
堆(Heap)
老年代(old)
新生代(young)
eden
s0(to)
s1(from)
进阶
垃圾回收算法
标记-清除
缺点:
1、标记和清除两个过程都比较耗时,效率不高
2、产生大量不连续的内存碎片,空间碎片会导致程序在运行过程中需要分配较大对象时,找不到足够连续内存而不得不提前进行一次GC
适用于老年代垃圾回收,比如CMS就采用此算法用作老年代的GC
1、标记和清除两个过程都比较耗时,效率不高
2、产生大量不连续的内存碎片,空间碎片会导致程序在运行过程中需要分配较大对象时,找不到足够连续内存而不得不提前进行一次GC
适用于老年代垃圾回收,比如CMS就采用此算法用作老年代的GC
标记-整理
缺点:
整理的过程比较耗时,适用于老年代的算法
整理的过程比较耗时,适用于老年代的算法
标记-复制
缺点:
1、存在大量的复制操作,效率会降低
2、空间利率降低,因为需要留出一半的空间复制用
此算法适用于新生代
1、存在大量的复制操作,效率会降低
2、空间利率降低,因为需要留出一半的空间复制用
此算法适用于新生代
垃圾算法选择
Young区:复制算法(对象在分配之后,可能声明周期比较短,Young用复制算法效率比较高)
Old区:标记清楚或者标记整理(old对象存活时间比较长,复制来复制去没有必要,不如做个标记在清理)
垃圾收集器
新生代
Serial
最原始的垃圾收集器,每次标记都需要STD 吞吐量太低 现在一般不怎么用了
parNew
serial 所具备的功能,他都具备。 就是将原理啊的单线程收集,修改为了多线程收集
parallel Scavenge
这里主要关注吞吐量:适合有大量计算的场景,且不需要太多交互的场景
老年代
CMS
浮动垃圾过多,预留空间不够垃圾回收线程使用,启用备用方案 Seial Old
新生代用的parNew, 这是一套组合
算法为:标记-清楚。 可通过参数设置,进行full GC 时需不要需要整理 old 区内存空间
原理:三色标记法,四个阶段,每个阶段用一种颜色标记为对象的不同类型
主要流程是
1、初始标记: 主要标记的是GC Roots 应用的对象,此过程很快 需要stw
2、并发标记: 此过程主要是遍历对象树,找出需要回收的对象
3、重新标记: 因为垃圾回收线程和用户线程同时在跑,此时会产生一些浮动垃圾,重新标记是为了标记这部分垃圾 需要stw
3、并发清理: 将标记好待回收的对象并发清理
注意此时:如果浮动垃圾大小,超过垃圾回收线程所需要的空间,这个时候就std,完了进行一次full 此时用的处理算法为 Seial Old
原理:三色标记法,四个阶段,每个阶段用一种颜色标记为对象的不同类型
主要流程是
1、初始标记: 主要标记的是GC Roots 应用的对象,此过程很快 需要stw
2、并发标记: 此过程主要是遍历对象树,找出需要回收的对象
3、重新标记: 因为垃圾回收线程和用户线程同时在跑,此时会产生一些浮动垃圾,重新标记是为了标记这部分垃圾 需要stw
3、并发清理: 将标记好待回收的对象并发清理
注意此时:如果浮动垃圾大小,超过垃圾回收线程所需要的空间,这个时候就std,完了进行一次full 此时用的处理算法为 Seial Old
默认触发FullGC,老年待使用比例大小为92 实际情况可按照业务处理。
具体的参数为:-XX:cmsiNitiatingOccu-pancyFraction 不可以太高
哗啦啦服务系统的CMS 参数比例大小设置为75
具体的参数为:-XX:cmsiNitiatingOccu-pancyFraction 不可以太高
哗啦啦服务系统的CMS 参数比例大小设置为75
parallel Old
新生代配合parallel Scavenge 使用, 适用于服务核心数量较小的服务器,和高吞吐量的
G1
不区分新生代和老年代。他是将堆内存区域划分为了不同大小的内存块(Region),这些块由E(Eden)、S(from/to)、O(old区)以及大对象的H(Humonus)
算法:复制+整理
原理:每次回收算选出来最有意义的、也可以理解为回收价值最大的对象,那么问题来了,怎样判断是回收价值最大的?
按照衰减平均值来计算的,这个计算方式比较复杂。暂时不做记录
主要流程为:
1、初始标记:主要标记的是GC Roots 指向的对象,耗时较短,此过程很快。需要stw
2、并发标记:遍历对象区域数,标记所有需要回收的对象
3、重新标记:也算是浮动垃圾的标记,此过程也需要stw
4、筛选回收:根据回收价值+用户所期望的停顿时间,完了进行回收需要清理的对象
原理:每次回收算选出来最有意义的、也可以理解为回收价值最大的对象,那么问题来了,怎样判断是回收价值最大的?
按照衰减平均值来计算的,这个计算方式比较复杂。暂时不做记录
主要流程为:
1、初始标记:主要标记的是GC Roots 指向的对象,耗时较短,此过程很快。需要stw
2、并发标记:遍历对象区域数,标记所有需要回收的对象
3、重新标记:也算是浮动垃圾的标记,此过程也需要stw
4、筛选回收:根据回收价值+用户所期望的停顿时间,完了进行回收需要清理的对象
跨区域的对象怎么处理? 采用卡表的数据结果,G1的每个Region 会有一个记忆集,存储了自己的指针和对象所在区域范围的指针
优化
指标
降低stw延迟:也就是说降低GC的频率
提升最大的吞吐量
减少内存的占用量:合理分配内存
原则
MinorGC回收原则:每次回收都要尽可能的回收更多的垃圾对象,以减少fullGC发生的频率
GC内存最大化原则:处理低吞吐量和高延迟问题,处理器可以使用的内存越大,效率也就越高。用户使用起来也就越流畅
GC调优3选2原则:在吞吐量、低延迟、内存占用率 这三个中只能选择其二配置,三者不可兼得。因为选择其中两个,必定会影响到其中一个
参数
-Xms 最小堆空间
-Xmx 最大堆空间
-Xss 虚拟栈大小
0 条评论
下一页
为你推荐
查看更多