1.程序计数器:
主要作用是记录正在执行的虚拟机字节码指令的地址,或者接下来要执行的下条指令地址,简单的说就是记录正在执行的代码地址或者将要执行代码的地址(这样说不是很准确,只是好理解)分支,循环,跳转,异常处理,线程回复等基础功能都需要这个计数器来完成
有线程恢复功能说明不是共享的,每个线程都有一个程序计数器
2.java虚拟机栈
程序猿最关心的"堆栈"中的栈指的就是虚拟机栈每个方法在执行的同时都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口等信息.
其中,局部变量表存放了: 存储对象引用和基本数据类型还有指向一条字节码指令的地址
3.方法区:
也叫静态区,存储class信息和static变量,final常量等数据,是各个线程共享的内存区域.
那方法区的东西什么时候会被回收呢?最直观的说法,就是程序结束时东西被回收!至于具体的可以看回收规则和算法4.运行时常量池:
它是方法区的一部分,class文件中除了有类的版本,字段,方法,接口等描述,信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用.这部分内容将在类加载后进入方法区的运行时常量池中存放.关于常量池,接触得最多的就是String了,关于这里的面试题还是比较多的. 查看详情
4.本地方法栈:
它与虚拟机栈所发挥的作用是非常相似的,虚拟机栈执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务.native方法指的是用其他语言(如c语言,java也可以)写的操控偏硬件的程序
5.java堆
唯一的目的就是存放对象实例,几乎所有的对象实例以及数组都要在堆上分配(比如Class对象就存放在方法区).也因此是垃圾收集器管理的主要区域.java堆可以分为:
1.新生代:存放比较新的对象.继续可以分为:Eden空间,From survivor空间,To survivor空间.具体会在垃圾收集器中讲解
2.老年代:存放老的对象
java堆可以处于物理上不连续的内存空间中,只有逻辑上连续的即可
6.直接内存
也称为堆外内存.可以实现在java堆外分配内存,这里对象的操作效率可以提高.总结:
运行时数据区包括:堆,栈(虚拟机栈和本地方法栈),方法区(包括常量池),程序计数器线程私有的:程序计数器;java虚拟机栈;本地方法栈;
线程共享的:java堆;方法区;
对程序猿来说,堆栈是最关心的,堆中存放对象,栈中存放对象的引用.使用对象时,通过栈中的引用找到对象进而使用
参考文献:<<深入理解java虚拟机>>周志明