jvm
dcy 2019-12-08
- jvm
- 虚拟栈区
- 方法区
- 本地方法区
- 堆
- 程序计数区
- GC
- 年轻代(young) 年老代(Tenured) 永久代(Perm)
- 算法:引用计数法 可达性分析算法(A被B引用,但是没有对象引用B,则认为A,B为垃圾对象)
- 清理算法: 标记-整理(Mark-Compact)(年老代)
标记清理的垃圾对象,统一清除。第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。(碎片清理)
复制(Copying)此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。
(年轻代)
st=>start: web请求
op=>operation: 请求线程池中,看是否有空闲的线程
op1=>operation: 创建新的线程
op2=>operation: 等待
op3=>operation: 请求超时
op4=>operation: jvm为新线程创建Java栈。P寄存器,(清闲线程)PC寄存器指向第一行可执行代码。
op5=>operation: 清闲线程
op6=>operation: 执行到main一个方法的时候
op7=>operation: 调用jvm本地方法区的方法(本地方法栈为虚拟机使用的Native方法服务)
op8=>operation: 加载类。(加载类对象,初始化静态属性)
op9=>operation: 在方法区查询
op10=>operation: 方法区存在。
op11=>operation: 方法区中加载类的方法。
op13=>operation: 栈添加栈栈帧,存储存储局部变量表、操作栈、方法返回值等
op14=>operation: 执行方法,栈的变量赋值
op15=>operation: 执行完毕。
op16=>operation: 线程返回线程池,由线程池进行重新设置
cond=>condition: 有清闲的线程
cond1=>condition: 线程池没有达到最大数目
cond2=>condition: 等待是否超时
cond3=>condition: 不是本地方法
cond4=>condition: 方法所在的类是否第一次加载
cond5=>condition: 不是静态类(单例模式)
cond6=>condition: 方法区不存在
e=>end: 结束
st->op->cond
cond(false)->cond1
cond(true)->op5->op4
cond1(false)->op2->cond2
cond2(false)->op
cond2(true)->op3
cond1(true)->op1->op4
op4->op6->cond3
cond3(false)->op7
cond3(true)->op8->cond5
cond5(false)->op9->cond6
cond6(false)->op10->op13
cond5(true)->cond4
cond4(false)->op9
cond4(true)->op11->op13
op13->op14->op15->op16->e