java随笔之JVM内存模型与类加载

本文介绍了JVM内存模型,重点讲解了JDK1.7版本的内存区域划分及其功能,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区。通过类加载与对象创建的过程,帮助理解JVM内存模型的实际应用。

前言

结合类加载与对象创建来梳理一下JVM内存模型的功能

JVM内存模型

在这里插入图片描述
图片来自 (https://www.cnblogs.com/zhou-yuan/p/14252272.html)

随着JDK的升级,方法区最后被淘汰,常见面试题主要以JDK1.7的模型为主

淘汰原因是对方法区的GC不好控制,内存也不好管理,容易OOM

功能

以JDK1.7为例

  • 绿色为线程共享,蓝色为线程独占
  • 程序计数器:记录线程执行到哪里,便于线程被唤醒后能够继续接着执行
  • 虚拟机栈:执行java方法的栈区,其由多个栈帧组成,每调一个方法就会生成一个栈帧,栈帧中会存储执行方法需要的临时局部变量以及一些引用·
  • 本地方法栈:执行本地方法的栈区,线程除了会执行对象的java方法,也会执行本地方法,对应在本地方法栈中运行
  • 堆:存放对象具体内容,包括对象的成员变量等,以及字符串常量池
  • 方法区:存放类信息,比如编译好的.class文件内容,其中包括方法,变量名等,.class文件中会区分静态与非静态,方法区也会有对应的静态区与非静态区

了解完概念,往往还是不容易记住,因为不知道这模型实际上是怎么运行的,因此,接下来结合类加载与对象创建过程,我们看看怎么利用JVM的

对象创建与类加载

这部分参考了 (https://www.cnblogs.com/study-everyday/p/6752715.html)

  1. 启动JVM,执行main方法
  2. 执行到 new Child()时,试图创建Child对象,由于Child继承了Parent,因此也试图创建Parent对象
  3. 此时会先去JVM的方法区中查找,是否有Chid.class 和 Parent.class,如果没有,则进行类加载
  4. 类加载过程包括加载、连接、初始化
    1. 在加载这一步,JVM会扫描Chid.class、Parent.class,并将其内容读入JVM方法区,其中静态内容读入方法区的静态区,非静态在非静态区中,并生成一个class对象
    2. 注意了这里的初始化指的是类初始化,而不是对象初始化,类初始化对应的是字节码文件的<clinit>方法,而对象初始化是<init>方法
  5. 类加载好后,就能从方法区中获取到class对应的信息,完成对象创建了
  6. 创建对象时,在JVM的堆内存中为其分配内存
  7. 当线程要执行对象方法时,会根据对象找到JVM方法区中对应的class结构信息,从而找到方法对应的代码块,拿入JVM的虚拟机栈中进行执行

上述过程涉及了JVM大部分区的使用,虽然比较简单,但能够加强对JVM的理解了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值