一.JVM
Jvm 主要的是由堆和栈组成
堆 :程序结束后由os回收
栈 :由操作系统自动分配释放存放参数值和局部变量
编译过程:
源文件->词法分析器->token流->语法分析器->语法树->语义分析器->注解抽象分析器->字节码生成器->Jvm字节码(.class)
类的生命周期
Loading linking Initalizing
加载->验证->准备->解析->初始化->使用->卸载
Loading
Jvm 加载Class文件的过程:
Java主要类型加载机制(双亲委派机制)
- Bootstrap ClassLoader
负责加载lib下的rt.jar的所有class文件 - Extension ClassLoader
负责加载扩展的jar - APP ClassLoader
加载classpath下的jar及class文件 - Custom ClassLoader
属于应用程序自己的需要的自定义ClassLoader
ClassLoader加载过程是先检查类是否已经被加载 检测的顺序是C->A->E->B,加载和检查的顺序相反
Linking 准备
主要是加载静态变量
Initalizing初始化
- 创建类的实例(new 一个对象)
- 对静态方法赋值
- 调用静态方法
- 反射
- 初始化一个类的子类
- 启动时表明启动类
Jvm 运行时的数据区
包括三部分1.方法区,2.堆区,3.栈区
- 方法区
主要含有类,静态变量,静态方法,常量,成员方法(线程不安全) - 堆区
主要包含所有的对象和它对应的实例变量和数组(线程不安全) - 栈区
主要包含局部变量,对象的引用,线程调用方法时的变量表,操作,方法
创建线程后会产生一个程序计数器和栈
程序计数器:存放每一次的执行方法的偏移量
栈:存放的方法 每一个栈帧存放1.局部变量区2.操作数帧
局部变量存放的是局部变量和参数
操作数帧存放的是执行的中间结果
二.GC
GC是java中的垃圾回收机制
Java中垃圾回收算法
-
标记清除算法
对对象进行扫描,然后标记为死亡对象或者说不可达对象进行清理
优点:简单粗暴
缺点:会产生小的碎片,影响后续使用 -
标记赋值方法
解决算法一的问题 先将内存空间分成两部分,一部分创建对象区域,一部分空闲区域;先对对象进行标记对存活的对象进行标记,标记后直接将存活对象直接复制到空闲区域
之后将原来的的区域全部清除
优点:解决了方法一的碎片化问题
缺点:有一半没有用真正用到的空间只有一半 -
标记整理算法
解决了标记复制的算法空间利用不高的问题,该算法先将对象进行标记,标记完将所有的存活对象移到一端,移动之后将边界外的一并处理掉。
优点:解决了内存空间运用不足的问题和碎片化的问题
缺点:对象移动会导致额外的程序增加了额外工作占用了时间 -
分代算法
分代算法主要是分为临时对象,持久对象,永久对象
临时对象:存活时间比较短的对象
持久对象:存活时间比较长的对象
永久对象:几乎不死的对象
分代算法将空间分为YOUNG 和 OLD 比例 1:2
YOUNG分为Eden ,FROM ,TO 比例 8:1:1
第一GC
将大对象放在老年区,将Eden和From中不可达的对象清除,将剩余的对象转到To中age+1这个时候To变为了From
第二次GC
将Eden和From的不可达的对象移除之后将存在的对象转移到To中之后age+1
N次GC
之后将To中的大age中的对象移到OLD区域
垃圾回收器
- 新生代的收集器:serial ,ParNew ,ParalleScavenge
- 老年代的收集器:CMS,serialOld,ParalleOld
- 堆栈收集器:G1
一、 Serial收集器
单线程,简单高效,没有线程的交互开销,适应于Client模式下的虚拟机
问题是必须暂停所有工作线程等到GC结束才能继续进行
二、 ParNew收集器
相当于Serial的多线程版
特点:多线程、ParNew收集器的线程数和CPU数量一致是适应于Server模式下虚拟机的新生代收集器
问题是必须暂停所有工作线程等到GC结束才能继续进行
三、 Parallel Scavenge收集器
属于新生代收集器采用的是复制的算法收集方式,又是并行多线程,与吞吐量有密切关系
四、 Serial Old
同样是单线程收集器,采用标记整理算法,适用于client和server模式下的虚拟机
五、 Parallel Old
Parallel Scavenge收集器的老年代,多线程,采用标记-整理算法
适应场景:注意高吞吐量及CPU资源敏感的场合
六、 CMS收集器
标记-清楚算法。并发收集,低停顿
适应于注重服务器的响应速度,希望系统停顿时间短场景下
第一步:初始标记:标记GC ROOTS能直接到对象,由stop the world的问题
第二步:并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行。
第三步:重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题
第四步:并发清除:对标记的对象进行清除回收
七、 G1收集器
应用于服务端的垃圾回收
能和GMS收集器一样和应用线程可以并行
复制对象的同时对对象进行压缩和释放内存
灵活分配老年化,年轻化占有
收缩空闲空间不会造成造成GC引起的应用停顿时间
精准预测GC停顿时间
回收步骤:
- 初始化标记: STW GCroot开始标记可达对象
- 并发标记:与对象线程同时进行
- 最终标记:并发标记的过程
- 筛选回收:回收相关的垃圾