一,运行时数据区域
见图java 虚拟机运行时数据区.png
二. 程序计数器
线程私有,当执行java方法时,程序计数器的值是虚拟机字节码指令的地址,当执行本地方法时值为空。
注意:java的多线程是通过轮流切换并分配cpu处理时间实现。谁来控制切换,谁来分配cpu时间?
三. java虚拟机栈
线程私有,生命周期与线程相同。
是秒描述java方法执行的内存模型。
每个方法执行时都会创建一个栈帧,用于保存方法的局部变量表(编译期即已确定内存大小,运行期不会改变这个大小),参数栈,动态连接(是什么,有什么作用?),方法出口等信息。一个方法从进入到执行完成就对应着这个方法的栈帧入栈和出栈的过程。
四. 本地方法栈、
与虚拟机栈类似,区别在于虚拟机栈是为虚拟机执行java方法(字节码)服务,本地方法栈是为java调用本地方法服务。
五. 堆
java堆的目的是为了存放实例对象。
以内存回收的角度看(垃圾回收器一般是使用分区算法),堆可以分为:新生代和老年代,再细分就是eden区,from survivor区, to survivor区, 老年区等。
以内存分配的角度看,有线程共享的内存和线程私有的缓冲区(Threads Local Allocation Buffer)。
六. 方法区
线程共享,用于存储类信息,常量,静态变量,即时编译器编译成的代码等信息。在hotspot虚拟机中目前是使用 “永久代”来实现方法区,但是这部分区域同样需要内存回收(主要针对常量池和类型卸载),只是条件更苛刻。
七. 运行时常量区
String a = "a";
String b = "a";
System.out.println(b == a);
结果是true
String a = new String("a");
String b = new String("a");
System.out.println(b == a);
结果是false
八. 直接内容
非虚拟机运行时数据区,对外内存。