Java基础:内存模型

  在java基础当中,有很重要一块的内容,就是关于java当中的内存模型,所涉及的问题无非就是关于java当中的类、实例、变量、常量、静态变量、方法等blabla的东西都分别存储在什么地方。这部分的内容虽然繁琐,但是也是面试当中经常涉及询问的部分,今天就在这里总结一下java当中的内存模型。

  首先我们来看一下java的内存模型大体分为了几个部分:

《Java基础:内存模型》

从图片当中可以看到,java运行是的内存模型,大体分为了五个部分:1.方法区(静态区)、2.虚拟机栈、3.本地方法栈、4.堆、5.程序计数器,在每一个不同的部分,分别存储着java运行当中不一样的信息,接下来将分类举例;

1.方法区(又称为静态区,也是GC机制当中的永久带)

1)是被线程共享的一个区域。

2)存储虚拟机加载的类的相关信息,如class、以及static变量、方法信息(包括方法名、参数、返回类型)、域信息等。

3)方法区还包含了常量池,常量池中存储了如字符串、final变量值、类名和方法名常量。

 

2.虚拟机栈(又称java栈)

1)是一个线程隔离的区域,即私有的,其他线程无法访问的、

2)每个线程创建的时候,jvm就会创建一个栈区,栈中只保存基础数据类型的对象自定义对象的引用(不是对象),对象都存放在堆区中 。

3)每个方法执行时都会创建一个栈帧用于存储局部变量表,一个栈区包含多个栈帧,当方法执行的时候生成的栈帧会对应入栈,当方法返回的时候,栈帧将被弹出

4)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

优点:存取速度比堆要快,仅次于直接位于CPU的寄存器。

缺点:必须确定的是存在stack中的数据大小与生存期必须是确定的,缺乏灵活性。

 

3.堆

1)是被线程共享的一个区域

2)存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

优点:堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器,java的垃圾收集器会自动收取这些不在使用的数据,

缺点:由于要在运行时动态分配内存,存取速度慢。

 

4.程序计数器

  由于Java是支持多线程执行的,所以程序执行的轨迹不可能一直都是线性执行。当有多个线程交叉执行时,被中断的线程的程序当前执行到哪条内存地址必然要保存下来,以便用于被中断的线程恢复执行时再按照被中断时的指令地址继续执行下去。为了线程切换后能恢复到正确的执行位置,每个线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存,这在某种程度上有点类似于“ThreadLocal”,是线程安全的。

 

5.本地方法栈

  本地方法栈和Java栈所发挥的作用非常相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

(这里也只是抛出了个概念,并没有涉及到这部分的使用,所以我也不是很清楚它是干嘛的)

 

    原文作者:Wellhold
    原文地址: https://www.cnblogs.com/WellHold/p/7423032.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞