一、内存模型
线程私有:虚拟机栈,本地方法栈,程序计数器
线程共享:方法区,堆
1.程序计数器
是当前线程所执行字节码的行号指令器,线程私有,如果执行的是Java方法,计数器记录的是虚拟机字节码指令的地址,如果执行的是本地(native)方法,则为空
2.虚拟机栈
描述Java方法执行的内存模型,每个方法在执行时创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口灯信息。方法调用到完成,对应着一个栈帧在虚拟机栈中从入栈到出栈的过程
3.本地方法区(本地方法栈)
本地方法区和虚拟机栈作用类似,区别是虚拟机栈为Java方法服务,而本地方法栈则为Navicat方法服务。在Hotspot vm中直接将本地方法栈和虚拟机栈合二为一
4.堆
是被线程共享的一块内存区域,创建的对象和数组都放在堆中,也是垃圾回收的主要区域。从GC的角度还可以细分为新生代(Eden、from survivor、to survivor)和老年代
5.方法区
即我们常说的永久代,用于存储被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。Hotspot将GC分代收集扩展至方法区,即使用Java堆得永久代来实现方法区
加载的类信息包括版本,方法,字段。接口等描述信息,还会有 编译器生成的各种字面量和符号引用(存放在运行时常量池)