第一小结
1.内存:数据区域{虚拟机进程,用户线程}
线程隔离数据区(私有):橙色部分
共享区域 : 蓝色部分
1)程序计数器: java方法 : 记录正在执行的虚拟机字节码指令地址
本地(Native)方法 : 空值
2)java虚拟机栈(服务于java方法) : 方法执行时, 创建一个栈用在存局部变量表,操作类栈,动态链接,方法接口等信息。
i)局部变量表所需空间在编译期间分配, 存储在局部变量槽(slot)主要有以下信息:
ii)基本数据类型,对象引用,returnAddress类型
3)本地方法栈 : 服务于本地(Native)方法
4)java 堆(GC堆):所有线程共享,虚拟机其定时创建用于存放对象实例
5)方法区 :共享区域,用于存储已被虚拟机加载的类型信息,常量,静态变量
JDK 7 之前方法区又称永久代,JDK7之后方法区移除了常量和静态变量
JDK 8 称为元空间 (主要剩下类型信息)
i)方法区回收主要是常量池的回收和类型的卸载。
OutofMerroyError : 无法满足新的内存分配需求。
ii)运行时常量池: 方法区一部分
一个class文件包括 类版本,字段,方法,接口 等,常量池表 (用于存放编译期生成的各种字面量与符号引用)
7)直接内存
第二小结
1)创建对象:
i)new指令-->常量池中定位-->类的符号引用-->类是否加载解析和初始化-->no的话执行类加载过程
ii)分配内存 : 指针碰撞,空闲列表