轻松搞定java内存模型(一)基本组成

 2019-12-10 16:19  阅读(1020)
文章分类:Java Core

20191210001732\_1.png

Java内存大概模型如上图,包含五大部分,其中方法区和堆是线程共享的,虚拟机栈,本地方法栈,程序计数器是线程私有的。

1:程序计数器

程序计数器可以看做当前线程所执行的字节码(可以简单理解为java类经过编译后便是字节码)的行号指示器,字节码解释器通过改变程序计数器的值来选区下一条需要执行的字节码指令。

如果正在执行的是一个java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行本地方法,计数器则为空。

通俗来说,程序计数器指向的是当前正在执行的某行java代码。本地方法是java调用非java代码的接口,该方法的实现由非java语言来实现(navtive method 是为了解决某些java语言不擅长解决的问题,提高效率,以及java环境与外界环境的交互,例如与底层系统,操作系统等的交互产生的)所以如果正在执行本地方法,计数器为空。

2:虚拟机栈

虚拟机栈描述的是java方法执行的内存模型,每个方法执行的同事创建一个栈帧(方法运行时的基础数据结构),用于存储局部变量表,操作数栈,动态链接等。每个方法调用的整个过程可以看做一个其对应栈帧入栈出栈的过程。

其中局部变量表,存放了编译期可知的各种基本数据类型(boolean ,byte,char,short等),对象引用(只是一个指向对象起始地址的指针)

通俗来说,虚拟机栈,就是我们常说的“堆栈”中的栈,只不过具体要更复杂。我们常说的栈,可以看做虚拟机栈的局部变量表。

3:本地方法栈

如上,虚拟机栈为java方法服务,本地方法栈当然就是为本地方法服务的栈。

小小结:程序计数器,本地方法栈,虚拟机栈可以看做对于一个线程的描述,他们没有存放对象的实体,但是存放了对于对象实体的描述,所以个人觉得这三个部分可以看做线程的描述,所以都是线程私有的。

4: 堆

众所周知,java堆就是存放对象实例的地方,所有的对象都存放在堆中,所以堆肯定是线程共享的。

5:方法区

方法区用于存放已经被虚拟机加载的类信息,常量,静态变量,JIT(即时编译器)编译后的代码等数据。通常来说,方法区存放着.class文件的二进制文件,而在堆存放这个类的java.long.class对象。

小小结:

方法区和堆存放的对象相关的东西,方法区存放对象的描述,可以看做一个对象的模型,堆中存放着根据这个模型创建的对象,所以方法区和对肯定是对线程共享的(每个线程都要使用很多类啊,一个类要被多个线程使用啊)。

小结:

Java内存模型中的这五部分是个基础,深入很复杂。笔者认为可以从线程和对象创建两个方面去理解,方法区和堆与对象相关,虚拟机栈,本地方法栈,程序计数器与线程相关。

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 轻松搞定java内存模型(一)基本组成

相关推荐