正文开始@Assassin
Java代码是要运行在Java虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,其中有些区域随着虚拟机进程的启动而存在。
概述:较小的内存空间,为当前线程执行的字节码的行号指示器
作用:通过改变计数器的值来指定下一条需要执行的字节码指令,来恢复中断前程序运行的位置
特点:
概述:每个方法从调用直到执行的过程,对应着一个栈帧在虚拟机栈的入栈和出栈的过程
作用:每个方法执行都创建一个“栈帧”来存储局部变量表、操作数栈、动态链接、方法出口等信息
特点:
创建时间:JVM启动时创建该区域
占用空间:Java虚拟机管理内存最大的一块区域
作用:用于存放对象实例及数组(所有new的对象)
特点:
作用:用于存储类信息、常量、静态变量、是各个线程共享的内存区域
Java内存模型:Java Memory Model(JMM)。JMM并不像JVM内存结构一样是真实存在的。它只是一个抽象的概念,JMM是和多线程相关的,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。
在JMM中,我们把多个线程间通信的共享内存称之为主内存,而在并发编程中多个线程都维护了一个自己的本地内存(这是个抽象概念),其中保存的数据是主内存中的数据拷贝。而JMM主要是控制本地内存和主内存之间的数据交互的。)
Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。
每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个instanceOopDesc对象,这个对象中包含了对象头以及实例数据。