java内存模型浅析(一)

java虚拟机在执行java程序过程中会把它所管理的内存划分为几个不同的数据区域,这些区域各有各的用途。

1.程序计数器

  线程私有,占用空间较小,字节码解释器通过改变这个计数器的值来选择下一条需要执行的字节码指令,例如 分支 循环 跳转 异常处理 线程恢复等等。

java虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式来实现的。所以,为了线程切换恢复后可以恢复到正确的执行位置,每条线程都需要一个程序计数器来工作,保证每条线程互不影响,独立存储,这也就是上文所说的线程私有。

2. java 虚拟机桟

线程私有,生命周期与线程相同,是java方法执行的内存模型,每个方法在执行的时候会入桟,此时也创建一个对应的桟帧用于存储局部变量表,操作数桟,动态链接,方法出口,返回值类型等,方法执行完毕便出栈

3.本地方法桟

与java虚拟机桟相似,只不过这里执行的是native方法罢了 ,在有的虚拟机中(Sun HotSpot)这两个桟已经合二为一。

在2   3 中  java虚拟机规范描述了两种异常情况:

如果线程请求的桟深度大于虚拟机所允许的最大深度,会抛出StackOverflowError异常。

在虚拟机桟动态扩展时,如果无法申请到足够的内存,则抛出OutOfMermoryError异常。

4  java 堆

线程公有,即为数据共享区。是java虚拟机管理的内存中最大的一块,主要用于存放对象实例。同时这个区域也是垃圾收集器管理的主要区域。这个区域又可以细分为新生代 老年代,新生代中又可以分为Eden区,Survivor (8:1)

这里又涉及到了对象创建 内存分配和回收策略等,这里不再详细叙述,有需要的可以查阅相关资料或者阅读 深入理解java虚拟机91页。

5 方法区

线程公有,主要存放已被加载类的类信息,常量,静态变量,方法方法引用等等

这个区域还涉及一个重要的区域:运行时常量池

主要存放编译的类的符号引用,各种字面量等




 

    原文作者:java内存模型
    原文地址: https://blog.csdn.net/qq_38844040/article/details/79767066
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞