JDK 1.8JVM的内存区域划分
运行时数据区域
该图标识的是JDK1.8的数据区域,与1.7比较不同的是元数据区取代了永久代,元数据空间的本质和永久代类似,都是对JVM规范中方法区的实现。元数据空间与永久代最大的差别在于:元数据空间并不在虚拟机中,而是直接使用本地内存。
上图中程序计数器,java虚拟机栈,本地方法栈属于线程私有的内存。
堆,元数据区,直接内存属于所有线程共享的内存。
1.程序计数器
程序计数器是一块较小的内存空间,可以看作当前线程执行的字节码的行号指示器。若线程执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;若正在执行的是一个Native方法,这个计数器值则为空。
2.java虚拟机栈
线程私有,每个线程对应一个Java虚拟机栈,其生命周期与线程同进同退。每个JAVA方法在被调用时就会创建一个栈帧,并将该方法入栈,一旦调用完成就出栈。当所有的栈帧都出栈后,线程也就完成了使命。在局部变量表中存储了8种基本数据类型,对象引用类型和returnAddress类型。
3.本地方法栈
与java虚拟机栈所发挥的作用类似,区别在于java虚拟机栈是为hava方法服务的,而本地方法栈则是为虚拟机栈使用到的Native方法服务的。
4Java堆
Java堆是java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此区域唯一的目的就是存放对象实例。Java堆是内存回收的主要区域(GC堆)。从内存回收的角度来看,java堆可以细分为新生代和老年代。
老年代:2/3的堆空间
新生代:1/3的堆空间
eden区:8/10的新生代空间
survivor 0:1/10的新生代空间
survivor 1:1/10的新生代空间
5元数据区
元数据区取代了1.7版本的永久代。元数据区和永久代本质上都是方法区的实现。方法区存放虚拟机加载的类信息,静态变量,常量等数据。
6 直接内存
直接内存并不是java虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。JDK 1.4引入了NIO,他可以使用Native函数库直接分配堆外内存。