JVM
2020-11-04 17:11:15 13 举报
jvm图解
作者其他创作
大纲/内容
....
from->to
自义定类加载器
委托给父加载器直到根加载器
常量池
程序计数器
动态链接
地址:0x111
扩展类加载器Extension ClassLoader
有
Java栈(Java Stack)
栈帧2
栈帧3....
.java文件
对象创建
Class文件
双亲委派机制1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.clas,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
应用类加载器AppClassLoader
getClassLoder()
操作栈
对象
GC复制粘贴算法
Class Loader
本地方法库(Native Methods)
类加载器与双亲委派机制
本地方法库接口(Native Method Interfave)
getClass()
直接加载
清除
元空间
标记压缩算法是对标记清除算法的优化,对对象进行标记后将对象进行压缩将活的对象压向一端,再进行清除,这解决了内存碎片化的问题,但在三个算法中效率是最低的
存活
类加载器(Class Loader)
空
类元信息
本地方法栈(Native Method Stack)
方法区
实例化,new
from
运行时数据区
堆(Heap Area)
伊甸园区
幸存区to
得到类加载请求
JVM模型
内存永远是一整块,不会出现内存碎片化的问题,而且每次内存中只有少部分是需要复制的对象,大部分是需要清除的,因此不需操作很多对象,效率高。但由于此算法需要一块内存做为备用内存,所以总有一块内存是空着的,造成内存的浪费。
应清除
标记是对需要清除的对象进行标记
无
压缩
getAge()
方法返回地址
GC标记清除算法
执行引擎(Execution Engine)
局部变量表
Demo01 private int age; public final static int APPLE ; public int getAge() public void setAge(int age) public static int getAPPLE()
栈帧1
例子
标记清除算法相对于复制粘贴算法,对于内存的利用率提高,但清楚后的内存都是碎片化的,如果此处存入一个大对象可能因为找不到合适的位置,再次触发垃圾回收机制。花费时间较长,需要遍历一次进行标记,再将需要清除的进行清除
堆
方法区(Method Area)
Demo01 demo01
老年代
对象2
幸存区from
对象1
to->from
0
栈
.Class文件
加载、初始化
本地方法栈
Java栈
程序计数器 (PC)
GC算法
类
幸存区
jdk1.8后取消了永久代采用元空间代替,元空间不是使用jvm内存而是使用本地内存,常量池也放入元空间
根加载器有无该加载类
public class Demo01 { private int age; public final static int APPLE = 0; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public static int getAPPLE() { return APPLE; } public static void main(String[] args) { Demo01 demo01 = new Demo01(); demo01.getAge(); }}
to
根类加载器BootstrapClassLoader(使用C++实现使用getClassLoader不能获取,因为没有权限)
Demo01Class信息(成员变量int age,成员方法 set和get,常量 apple)
方法元信息
新生代:新生代的对象需要频繁进行操作并且普遍的存活率不高,复制粘贴算法效率高的特点比较适合与新生代进行搞作。老年代:老年代的对象操作次数较少,普遍对象存活率高,所以标记压缩算法比较适合
GC标记压缩算法
交给子加载器没有就继续交回给子直到自身
引用
main方法
新生代
0 条评论
下一页