面试题之JVM内存区域
1、Java内存区域(运行时数据区域): jdk1.8之前:虚拟机运行内存分栈、堆和方法区这几种。 栈:虚拟机栈、本地方法栈、程序计数器。(线程私有,每个线程都拥有各自的) 程序计数器:一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。主要有2个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪里了。 注意:唯一一个不会出现OutOfMemoryError的内存区域,它的生命周期随着线程的创建而创建,随着线程的结束而死亡。 Java虚拟机栈:生命周期与线程相同(随着线程创建而创建,随着线程死亡而死亡),描述的是Java方法执行的内存模型,每次方法调用的数据都是通过栈传递的。Java内存大概就是堆内存和栈内存,栈是虚拟机栈或是虚拟机栈中局部变量表部分。(实际上,Java虚拟机栈是由一个个栈帧组成,每个栈帧中都拥有:局部变量表、操作数、动态链接、方法出口信息) 局部变量表主要存放了编译器可知的各种数据类型 (boolean、byte、char、short、int、float、long、double)、 对象引用 (reference类型,不同于对象本身,可能是指向一个代表对象起始地址的引用指针