jvm模型
保存在着被加载过的每一个类的信息(虚拟机加载的类信息(类的版本、字段、方法、接口),常量,静态变量,即时编译器编译后的代码等数据);这些信息由类加载器在加载类的时候,从类的源文件中抽取出来;static变量信息也保存在方法区中。
可以看做是将类(Class)的元数据,保存在方法区里。
方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。
5大区存放内容以及特性
区域 | 线程是否私有 | 存放内容 |
---|---|---|
堆 | 共享 | 对象实例 |
方法区 | 共享 | 类信息,常量,静态变量等 |
本地方法栈 | 私有 | Native |
虚拟机栈 | 私有 | 每个方法在执行的时候也会创建一个栈帧, |
程序计数器 | 私有 | 当前正在执行的字节码的行号 |
java对象生命周期
@startuml
'https://plantuml.com/activity-diagram-beta
start
:创建;
note right
new Object()
end note
:使用;
:不可见;
note right
{
Object t = new Object()
}
while(true){...}
// 虽然t已经超出访问范围 但死循环导致同处于相同栈帧的对象t无法被回收
end note
:不可达;
note right
Dog dog = new Dog(); //line 1
dog = null; //line 2
end note
:回收;
note right
当不可达阶段(unreachable)的对象被GC识别后会进入回收阶段(collected),
这是重新分配前的阶段。如果对象定义了finalize方法,要将释放内存的操作放在
finalize 方法之前。
end note
:终结;
note right
当对象的finalized方法执行后仍处于unreachable状态,就进入最终状态,等待GC
执行垃圾回收。
end note
:对象空间再分配;
stop
@enduml
jvm分代GC
@startuml
'https://plantuml.com/activity-diagram-beta
start
:新对象进入Eden区;
repeat
:Minor GC ;
note right
eden、from survivor、to survivor(8:1:1)
新生代这样划分是为了更好的管理堆内存中的对象,
方便GC算法---复制算法来进行垃圾回收,(Minor GC)频繁。
end note
fork
:Eden区检查;
if (存活) then (true)
:进入to区;
else
:回收;
stop
endif
fork again
:From区检查;
if (存活) then (true)
:进入to区;
:年龄+1;
else
:回收;
stop
endif
fork again
:To区检查;
if (存活) then (true)
:进入From区;
:年龄+1;
else
:回收;
stop
endif
end fork
while (年龄 < max)
:进入Old区;
note right
标记--整理算法
end note
stop
@enduml