java虚拟机运行时数据区
程序计数器:每个线程私有的,独立存储,互不影响。当前线程所执行字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值,来选取下一条需要执行的字节码指令。
java虚拟机栈:也是线程私有的,生命周期与线程相同。
它描述的是java方法执行的内存模型:每个方法被执行的时候同时会创建一个“栈帧”用于存储局部变量表、操作栈、动态连接、程序出口等信息,每个方法被调用直到完成的过程,就对应着一个帧栈在虚拟机栈中由入到出的过程。溢出会报outOfMemoryError。
我们通常粗略的把java内存分为堆区和栈区,这个栈区所指的就是局部变量表部分,局部变量表存储着各种基本数据类型和对象引用。
本地方法栈:和java虚拟机栈的作用相似,只不过是为使用到的native方法服务,但也有的版本的虚拟机把本地方法栈和java虚拟机栈合二为一。
java堆:此内存区域唯一的目的是存放对象实例,几乎所有的实例对象都在这里分配内存,是各个线程共享的区域,因此是垃圾收集器GC的主要管理区域。溢出会报outOfMemoryError。
方法区:各个线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量。无法满足内存分配需求时,将抛出outOfMemoryError。
运行时常量池:属于方法区的一部分,Class文件除了有类的版本、字段、方法、接口等信息外,还有就是常量池,用于存放编译期生成的字面变量和符号引用,这部分内容在类加载后被放到方法去的运行时常量池中。无法活内存时将抛出outOfMemoryError。
直接内存:不属于运行时数据区,NIO引入了基于管道与缓冲区的IO方式,它使用native函数直接分配堆外内存。