Jmm模型

类的加载过程

 .java文件经过编译以后会得到一份新的.class文件,class文件经过类加载器加载,加载之后进行链接,链接阶段(验证  准备  解析),链接完成之后进行初始化。

类的加载

通过类加载器加载class文件,加载完毕之后等待链接;
常用的类加载器有:bootstrap类加载器,ext扩展类加载器,应用程序加载器。

链接

  链接阶段主要分为三个小阶段,分别如下:
  验证: 检查class文件是否合法。
  准备:初始化类里面的静态变量。
  解析:类加载器加载本类引用的其他类

初始化

初始化主要是为静态变量赋初始值,之前准备阶段是JVM的默认行为,此阶段为静态变量赋初始值主要是开发者为静态变量赋的值,静态代码块就是在这一阶段执行的。

小结: 类的加载过程主要是有类加载子系统完成的

JVM运行时数据区

jvm运行时数据库也就是JVM内存模型;内存模型主要由堆,栈,方法区,本地方法区,程序计数器,元数据区等。内存模型图如下:

在这里插入图片描述

每一个线程的执行都会在创建一个栈,线程调用每一个方法的时候都会创建一个栈帧,该栈帧里面包含了局部变量表,操作数栈,动态链接,方法的出口。
当一个变量被执行的时候,JVM会将该变量的值压入栈帧,把该变量的值存入到局部变量表,之后从栈帧中弹出。当需要运算的时候,再从局部变量表中将变量值压栈,参与运算的值称为操作数,运算的结果将会被存入局部变量表;如果方法执行完毕之后,要么将运算的结果返回,要么不返回任何值直接结束昂发的调用,栈帧消失。如果方法有返回值的时候,那么方法的入口将会找到方法的调用者,将返回值返回给方法的调用者。之后栈销毁。

堆空间主要是存放对象实例,通过new关键字创建的对象全部都放入这块内存空间,
根据Java虚拟机规范把堆空间分为新生代和老年代,新生代的划分又可以划分为三个部分分别是:eden区,from区,to区;新创建的对象一开始被放入eden区,当eden区满了之后JVM会进行一次minor GC将对象放入from区,from区会和to区交换,当进行输出的minor GC之后发现from区和to区都满了,这是就会将那些年龄大于15的对象放入到老年代,一开始年龄是0,每交换一次,年龄自增1;当年龄大于15的时候会将相应的对象放入老年区。当老年区满了以后这时候JVM会进行一次FULL GC,会某系已经没有应用的对象回收(判断某一个对象是否还存在应用,主要是从栈局部 变量表中检查该对象还存不存在引用,如果没有,则被GC回收);如果进行一次FULL GC以后,堆空间任然还没有足够的空间来存储新的对象这是JVM会抛出一个内存溢出的异常(OutOfMemery Exception)

在这里插入图片描述

方法区

 方法区是用于存储类的信息,方法的字节码,静态常亮,静态变量,运行时常量池等,在JDK1.8之前,方法区是堆的一个逻辑部分。JDK1.8之后oracle公司将hotpot虚拟机和Jrockit虚拟机进行评估,把方法区的空间分配独立于堆区,单独分配一块独立的内存空间给方法区;1.8以后叫做元数据区。

本地方法区

本地方法区主要是为加载第三方语言库而分配的内存空间;Java语言方法被native修饰的方法调用的时候主要是通过本地方法接口加载第三方语言库里面的方法(动态链接接口)。

执行引擎

执行引擎包含了解释器(interupter),GC,JIT compiler,主要是等待CPU分配资源执行class文件。

总结:

   JVM的基本组成就是由类加载子系统,运行时数据区(JMM 内存模型),执行引擎组成。
   最终流程图如下:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值