JVM内存结构

首先我们要知道jvm的组成:

  • 两个子系统(class loader(类加载),Execution engine (执行引擎))
  • 两个组件(Runtime data area(运行时数据区),Native Interface (本地接口))

再次我们说下jvm运行java的一个大概流程:
首先通过编译器把java代码转换成字节码,类加载器再把字节码加载到内存中,将其放在运行时数据区的方法区内,然后需要解析器执行引擎把字节码翻译成底层系统指令,再交给CPU去执行,这个过程需要调用其他语言的本地接口库(Native Interface)来实现整个程序的功能

再者,我们一般说的jvm内存结构就是jvm的运行数据区的结构:
JVM内存结构,Java内存模型 ,Java对象模型需要注意的几点:

  1. 以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。
  2. 规范中定义的方法区,只是一种概念上的区域,并说明了其应该具有什么功能。但是并没有规定这个区域到底应该处于何处。所以,对于不同的虚拟机实现来说,是由一定的自由度的。
  3. 不同版本的方法区所处位置不同,上图中划分的是逻辑区域,并不是绝对意义上的物理区域。因为某些版本的JDK中方法区其实是在堆中实现的。
  4. 运行时常量池用于存放编译期生成的各种字面量和符号应用。但是,Java语言并不要求常量只有在编译期才能产生。比如在运行期,String.intern也会把新的常量放入池中。
  5. 除了以上介绍的JVM运行时内存外,还有一块内存区域可供使用,那就是直接内存。Java虚拟机规范并没有定义这块内存区域,所以他并不由JVM管理,它是利用本地方法库直接在堆外申请的内存区域。
  6. 堆和栈的数据划分也不是绝对的,如HotSpot的JIT会针对对象分配做相应的优化。

如上,做个总结,JVM内存结构,由Java虚拟机规范定义。描述的是Java程序执行过程中,由JVM管理的不同数据区域。各个区域有其特定的功能。

Java内存模型

在前面的关于JVM的内存结构的图中,我们可以看到,其中Java堆和方法区的区域是多个线程共享的数据区域。也就是说,多个线程可能可以操作保存在堆或者方法区中的同一个数据。这也就是我们常说的“Java的线程间通过共享内存进行通信”。

Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的

Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型
JVM内存结构,Java内存模型 ,Java对象模型在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。

JAVA对象模型

Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。

HotSpot虚拟机中,设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。
JVM内存结构,Java内存模型 ,Java对象模型
这就是一个简单的Java对象的OOP-Klass模型,即Java对象模型。

总结

JVM内存结构,和Java虚拟机的运行时区域有关

Java内存模型,和Java的并发编程有关

Java对象模型,和Java对象在虚拟机中的表现形式有关

相关文章: