JVM内存模型
一、JVM 1.8内存区域划分
1、程序计数器(线程私有)
每个线程都有自己的程序计数器,用于记录当前线程虚拟机字节码的指令地址,如果CPU切换,切换回来可以继续执行;如果当前线程是native方法,则为空。
2、虚拟机栈(线程私有)
java每启动一个线程,就会有自己的一个虚拟机栈,每个方法在执行的时候会创建一个栈帧,用于存放:
- 局部变量表
- 操作数栈
- 动态链接
- 方法返回地址
每个方法在执行开始到结束的过程,对应了栈帧在虚拟机栈的入栈和出栈的过程;
如果线程请求的虚拟机栈深度大于虚拟机所允许的最大深度则会抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则会抛出OutOfMemoryError异常。
3、本地方法栈(线程私有)
执行的是native方法,当然也会抛出StackOverflowError和OutOfMemoryError异常。
4、 堆(线程共有)
这个区域存放的是对象实例,所有的对象实例以及数组都在堆上进行分配;jdk1.7版本以后,字符串常量从永久代中剥离出来,存放在堆中。该区域又分为年轻代和老年代,年轻代和老年代默认的比例是1:2,其中年轻代又分为Eden区、survivor0、survivor1区,默认比例是8:1:1。
5、方法区(元空间)
元空间取代了1.7版本及以前的永久代。
以上是对Jdk1.8的内存模型的简单介绍,如果有理解不对的地方,谢谢指出。