程序计数器:可以看作是当前线程执行字节码的行号器。每个线程都有一个自己的程序计数器。字节码执行判断 循环等操作是就是改变程序计数器的值来完成操作的。
注意:当前的线程执行的是Native方法的时候,程序计数器的值为空。调用本地方法的时候回重新起一个线程去执行本地方法,当前的线程阻塞到新起的线程执行完毕。
JAVA虚拟机栈:java 虚拟机栈也是线程私有的 。java虚拟机栈是java方法执行的内存模型。每个方法在执行的时候都会创建一个栈帧,这个栈帧用于存储局部变量表,操作数栈,动态链表,方法出口等等信息。
局部变量表存放的是基本的数据类型(long,int ,boolean....),对象的引用类型(指向对象起始地址的引用地址,也可能是指向一个代表对象的句柄或其他与此对象相关的位置。)
本地方法栈 本地方法栈的机制和java虚拟机栈的机制是一样的,但是本地方法栈监管的是本地方法,即Native方法。
java 堆:对象的实例和数组在堆上分配内存。java堆内存被分为两个部分即:新生代,老年代。如果要分的再细致一点的话就是Eden, From Survivor,To Survivor空间等。该比例为8:1。每次是用Eden和其中的一个Survivor,当垃圾回收的时候,就将存活的对象复制到另一个Survivor 上,最后清理掉Eden和刚才使用的Survivor。
通过-Xmx(最大)和-Xms(最小)来控制堆内存的大小。
方法区:他本用于存储已被虚拟机加载的类信息,常量,静态变量,以及即时编译后的代码等数据。
注意该区域的内存回收主要针对的是:常量池的回收和对类型的卸载。
运行时常量池是方法区的一部分,用于存放的是编译期生成的各种字面量和符号引用。
原文地址:http://blog.51cto.com/13919712/2292425