1 JVM深入学习
1.1 JDK,JRE,JVM三者之间的关系
1.2 为什么要学习JVM
因为JVM帮我们自动处理了内存管理,让我们不关注垃圾回收,所以JAVA才流行了这么久,
java底层决定了所写的代码逃不出---数据流、指令流、控制流,三大流
1.3运行时数据区解释
1 程序计数器:指向当前线程正在执行的字节码指令的地址(行号)
2 虚拟机栈: 栈--》数据结构 存储当前线程运行时所需要的数据、指令、返回地址。java中的方法是线程来执行的。
1.局部变量:存储定长的局部变量,寻址 4G 2的32次方。局部变量中的成员变量(Object a=new Object())在堆中,局部变量中只存储了成员变量的地址
2.操作数栈:把局部变量中的数据在操作数栈进行数据操作,然后再弹栈存到局部变量表中,局部变量表第0位存的是this。
3.动态链接:运行时多态,调用service的方法,运行时service回去找真正实现这个方法的类。
4.本地方法栈:方法是本地的方法,编译之后是看不出源码的,需要去官方文档查看。
5.方法区:存放静态变量,final常量等。
6.堆:所有new的对象。
重点:栈是线程独享,堆,方法区为线程共享
栈是先入后出:栈顶的元素先执行
1.4 内存模型
上面展示的是1.8版本之前的和1.8版本之后的内存模型区别。
新生代:主要包括eden区和两个servivor区,主要用于存放新建对象,eden空间不足已到servivor区,多次回收还存活的对象移动到老年区。
老年区:存放生命周期长的,想application级别的缓存。
永久区:保持class,method,field等对象
新生代回收: 采用复制回收算法。
旧生代回收:采用标记回收算法
栈的回收:采用的是弹栈