java内存区域
1。运行时数据区域
1.1 方法区(method area)
是各个线程共享的内存区域。存储已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。hotspot虚拟机使用永久代来实现方法区。java虚拟机在这个区的规范:可以选择固定大小或者可扩展,还可以选择不实现垃圾收集。
这个区域的垃圾收集目标主要是针对常量池的回收和对类型的卸载,回收的效果一般,尤其是类型卸载,条件相当苛刻。运行时常量池(runtime constant pool)是方法区的一部分。Class文件包含了类的版本、字段、方法、接口等描述、还有常量池表(constant pool table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池。
1.2 堆(heap)
java堆是虚拟机所管理的内存中最大的一块。也是各个线程共享的内存区域,在虚拟机启动时创建。此区域唯一的目的存放对象实例。java堆是垃圾收集器管理的主要区域。堆空间可分为新生代和老年代,新生代分为,一个Eden和两个Survivor。
1.3 虚拟机栈(vm stack)
虚拟机栈是线程私有的,生命周期和线程相同。vm stack描述的是java方法执行的内存模型:每个方法执行时都会创建见一个栈帧存储局部变量表、操作栈、动态连接、方法出口等信息。局部变量表存放了编译期可知的java8种基本数据类型和reference类型,reference可能是指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者对象的相关位置和指向一条字节码指令的地址。
如果线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError。当无法申请到足够内存时抛出OutOfMemoryError异常。
1.4 本地方法栈(native method stack)
与虚拟机栈作用类似,本地方法栈则是为虚拟机使用到native方法服务。虚拟机规范中没有对其做强制规定,因此具体的实现也有差异,sun的hotspot将本地方法栈和虚拟机栈和二为一。
1.5 程序计数器(program counter register)
线程私有的。 它的作用可以看做是当前线程的所执行字节码的行号指示器。