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