硬刚JAVA虚拟机之Java内存区域

一、程序计数器
1.一块较小的内存空间,线程执行字节码的行号指示器,通过改变行号指示器的值来选取下一条指令。比如分支,循环,跳转,异常处理。
2.在确定的时间内,一个处理器的线程都只会执行线程中的一条指令,因此线程执行指令后,要恢复到正确的位置,每个线程都需要一个程序计数器,方便线程切换后回到正确的位置。所以程序计数器是属于线程私有的内存区域。
3.最后,线程如果执行的是Java 方法,程序计数器记录的是执行的虚拟机字节码指令的地址,如果是native方法则是null.

二、Java虚拟机栈
1.线程私有,声明周期和线程相同。
2.虚拟机栈描述的是Java方法执行的内存模型,每个方法执行的时候都会创建一个栈帧,存储局部变量,操作数栈,动态链接,方法出口信息。
3.平时所说的栈,值的是虚拟机栈中的局部变量表。局部变量表存储了基本数据类型,和对象引用,长64位的lang 和double占两个局部变量空间。局部变量所需要的空间在编译器完成分配。进入方法时候,为这个栈分配多少内存空间是完全确认的。在运行期间不会改变,变量表大小。
4.异常:线程请求栈深度大于虚拟机运行的栈深度,抛出StackOverflowError异常。虚拟机栈如果可以动态扩展,在扩展的时候无法申请到足够的内存,就会抛出OutOfMemoryError异常。

三、本地方法栈
本地方法栈,如同Java虚拟机栈,区别是本地方法执行的是Java中的native方法。Java虚拟机栈执行的是Java方法。

四、Java 堆
1.堆 是Java虚拟机管理的最大内存中最大的一块。同时Java堆也是线程共享的。
2.堆中存储对象实例,同时也是JAVA 垃圾收集器管理的主要区域。
3.可以分,新生代和老年代。细化可分Eden,Form Survivor空间 To Survivor空间。从内存分配角度看,线程共享的堆,可能分出多个线程私有的分配缓冲区。

五、方法区
1.线程共享,存储被加载的类信息,常量,静态变量,即时编译后的代码数据。
运行时常量池是属于方法区域的一部分,里面存放字面量和符号引用

六、直接内存
不属于JAVA虚拟机运行时候数据区的一部分。也不属于虚拟机规范中定义的内存区域。但是可能频繁使用。因为NIO基于通道和缓冲的IO方式,他可以在堆外分配内存,然后再JAVA堆中使用DirectByteBuffer对象作为这块内存区域的引用经行操作。

最后文章的内容来自深入理解JAVA虚拟机

发布了6 篇原创文章 · 获赞 0 · 访问量 103

猜你喜欢

转载自blog.csdn.net/Chenpeng02/article/details/99825677
今日推荐