jvm内存模型浅析

首先要说明的是,jvm的结构相当复杂且不同的jvm还有不同的实现,我这里仅仅是根据相关书籍做个简单的分析。

要了解java中对象和变量(静态变量,实例变量,局部变量)究竟在哪里进行创建以及内存分配,就必须先大概了解一下jvm的内存模型。如图:

程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。由于每个线程执行代码的进度是不同的,而程序计数器总是能指向当前要执行的字节码。为了各线程互不影响,每条线程都有一个独立的计数器。

虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,线程中每个方法在执行的同时,都会创建一个栈帧(Stack Frame[1])用于存储局部变量表、操作数栈、动态

链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。我们平常所说的堆内存和栈内存中的栈内存就是指这

块区域。在每个方法对应的栈帧中,都有一个局部变量表,该表中存放了方法参数,以及方法中的局部变量的各种变量。这些变量的地址空间也就是在这里分配的。

本地方法栈(Native Method Stack)为虚拟机使用到的native方法提供服务。这部分区域不用关注太多。

堆(Java Heap)是这些内存区域中最大的一块。java的垃圾回收器主要也是针对这部分的数据进行垃圾回收(当然其他区域也会收集).这块区域时所有线程共有的。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。我们平常经常

说的运行时常量池就是在这部分区域。


类加载阶段:

加载:当jvm加载一个类时,类加载器会首先将对应的以二进制的class文件加载进内存。class文件中保存了java类中的常量池(要查看class文件中的常量池可以通过javap -c命令),以及所有关于该类的信息。加载完成后,会生成一个一个java.lang.class对象,作为访问方法去中各数据结构的入口

验证:验证操作主要验证该class文件是否符合jvm的需求

准备:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。这里的类变量就是指static修饰的静态变量,不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在Java堆中。这阶段将会为所有的类变量赋初值,也就是int类型赋0,引用类型赋null等。但并不会执行程序定义的赋值操作,如public static int value=123;经过准备阶段后,value为0,而不是102。但是如果时final类型的,又会执行该赋值初始化。这就是全部的加载过程


经过上面的类加载过程,我们就可以通过加载过程中生成的class对象在堆中生成一个对象。实例变量和对象是绑定的,因此实例变量自然也在堆中;

静态变量经过我们上面的分析可知,它存在方法区中,且数量不会随着对象的增加而增加;

当我们要执行某个方法时,jvm会为该方法在虚拟机栈中创建一个栈帧,里面存储局部变量表,操作数栈等数据,因此局部变量存在虚拟机栈栈中。


对象除了可以在堆中存在外,还可以在运行时常量池中存在,上文我们知道运行时常量池是位于方法区的。

所以对象可以主要在堆上创建,小部分(如string,Integer等字面量对应的对象)也可以在常量池中存在。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)模型是指Java程序在运行时的执行环境,包括JVM的组成部分和它们的工作原理。JVM内存模型是指Java虚拟机管理程序运行时内存的方式,包括内存划分、内存分配和对象回收等机制。 JVM模型的组成部分包括类加载器、解释器、即时编译器、垃圾收集器等。类加载器负责将Java类加载到JVM中,并将其转换为可执行代码;解释器负责解释字节码并执行相应的指令;即时编译器则将频繁执行的代码编译成本地机器码,以提高程序的执行效率;垃圾收集器则负责回收程序运行时不再使用的内存。 JVM内存模型规定了Java程序运行时内存的分配和管理方式。JVM内存模型将内存划分为不同的区域,包括方法区、堆、虚拟机栈、本地方法栈和程序计数器。其中,堆是Java程序运行时内存中最大的区域,用于存储对象实例。虚拟机栈和本地方法栈则用于存储程序执行时的局部变量和方法调用信息。方法区用于存储已加载的类信息、常量池、静态变量等数据。程序计数器则用于记录当前线程所执行的字节码指令位置。 JVM内存模型还包括垃圾回收机制,用于自动回收程序运行时不再使用的内存。垃圾回收机制采用标记-清除、复制、标记-整理等不同的算法来回收内存。 总之,JVM模型和JVM内存模型是Java程序运行时的重要组成部分,了解和掌握它们的工作原理对于编写高效、稳定的Java程序至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值