JVM内存模型
JVM内存模型
JVM-就是Java虚拟机
主要由ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Interface(本地库接口)组成
JVM屏蔽了平台,使Java只需要生成在JVM上运行的字节码文件,就可以实现多平台。
JVM的执行过程
Java文件通过javac编译为class文件,然后JVM通过ClassLoader加载到Runtime Data Area,由Execution engine翻译为操作系统指令集交给CPU执行,此时会调用到Native Interface。
在内存中,堆和方法区是所有线程共有的,而虚拟机栈、本地方法栈和程序计数器是线程私有的
堆
虚拟机所管理的最大的一块内存,所有线程共享,在虚拟机启动时创建,唯一的目的就是存放对象实例。
堆内存通常被划分为新生代和老年代,新生代中通常也会进行一定的划分,这主要关系到JVM的垃圾回收机制(分代收集理论)。我们通常认为大多数对象的存活时间都很短,而一个被经常使用的实例对象越不容易死去,因此垃圾收集器根据年龄(对象经过垃圾收集过程的次数)来将Java堆划出不同的区域存储。
方法区
与堆一样是所有线程共享的区域,存储已经被虚拟机加载的类型信息,常量、静态变量、代码缓存等。也可以叫metaSpace(元空间)
类名、父类名、修饰符、直接接口的有效列表
成员变量的相关信息
方法的相关信息
JVM 栈
线程私有的,生命周期与线程相同,描述方法运行时的线程内存模型,存储局部变量表、操作数栈、动态连接、方法出口等,方法的执行就对应栈帧的入栈和出栈。
本地方法栈
与JVM栈类似,只不过JVM栈为字节码服务,而本地方法栈为本地库的方法服务。
程序计数器
JVM的字节码解释器在工作时,就是要通过改变程序计数器的值来选取下一条要执行的命令,像分支、循环、跳转、异常处理、线程恢复都依赖计数器完成
程序计数器的作用就是存放指令地址, 确定了指令的执行顺序!
需要注意的是,除程序计数器外,其他区域都规定了在内存不足时会抛出OutOfMemoryError异常。
如有疏错,恳请指证。