1.程序计数器(Program Counter Register)
程序计数器是内存中较小的一块区域,属于
线程私有
的。可以把它看成当前线程执行的字节码行号指示器
,通过它来确定执行的下一行字节码,程序的循环、跳转、线程恢复等等都需要依赖它来完成。我们知道java多线程是通过轮流切换CPU时间片来完成的,在线程切换过程中恢复线程到原来执行的位置则是靠程序计数器完成的。
2.Java虚拟机栈(Java Virtual Machine Stacks)
和程序计数器一样,虚拟机栈也是线程私有的。它是用来保存我们的引用变量和基本数据类型的区域。每执行一个方法虚拟机会给其分配一个栈帧存放我们的局部变量和方法出口等信息。
4. Java堆
堆内存是所有线程共享的,存放我们的
数组
与所有对象实例
。Java堆是垃圾收集器作用的主要区域,内存回收的角度看,由于现在的收集器基本都是采用分代收集算法,所以Java堆中还可以细分为:新生代
和老年代
;新生代回收一般使用复制算法
,因为新生代的存活率较低,复制的成本也较低。而老年代则是使用标记清除算法
进行回收。
5.方法区
方法区存放加载后的
类信息、常量、静态变量
的等。在方法区中有一块区域叫运行时常量池
,在类加载过程中用于存储编译期生成的各种字面量和符号引用。字面量则包过文本字符串 、基本类型的值 、被声明为final的常量等;符号引用则包过:类和结构的全限定名、字段名称和描述符、方法名称和描述符
,;其中JDK1.7之前运行时常量池包含字符串常量池,存放于方法区中。而1.7之后字符串常量池被单独移动到了堆内存。