一、JVM的体系结构


类装载系统

1、定位和导入二进制class文件

2、验证导入类的正确性

3、为类分配初始化内存

4、帮助解析符号引用

执行引擎

执行包在装载类的方法中的指令,也就是方法

运行区数据

虚拟机会在整个计算机内存中开辟一块内存存储JVM需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器。

GC

垃圾回收器,是负责回收内存中无用的对象,就是这些对象没有任何引用了,它就会被视为垃圾,也就会被删除。

二、类在JVM的执行流程


那么类在JVM的执行流程是怎么做的呢?共有三步:加载、链接和初始化。

加载

JVM将java类的二进制形式加载到内存中,并将它缓存在内存中,以便后面使用,如果没有找到指定的类就会抛出异常ClassNotFound,进程在这里结束。没有错误就继续在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口。

链接

这个阶段做三件事:验证、准备和解析(可选)。

验证是JVM根据java语言和JVM的语义要求检查这个二进制形式。例如,如果篡改经过编译后的类文件,那么这个类文件可能就不能使用了。

准备是指准备要执行的指定的类,准备阶段为变量分配内存并设置静态变量的初始化。在这个阶段分配的仅为类的变量(static修饰的变量),而不包括类的实例变量。对非final的变量,JVM会将其设置成“零值”,而不是其赋值语句的值:

public static int num = 8;

那么在这个阶段,num的值为0,而不是8。 final修饰的类变量将会赋值成真实的值。

解析是检查指定的类是否引用了其他的类/接口,是否能找到和加载其他的类/接口。这些检查将针对被引用的类/接口递归进行,JVM的实施也可以在后面阶段执行解析,即正在执行的代码真正要使用被引用的类/接口的时候。

初始化

在这最后一步中,JVM用赋值或者缺省值将静态变量初始化,初始化发生在执行main方法之前。在指定的类初始化前,会先初始化它的父类,此外,在初始化父类时,父类的父类也要这样初始化。这个过程是递归进行的。

简而言之,整个流程是将类存进内存中,检查类的对应调用的类和接口是否可正常使用,再对类进行初始化的过程。

类在JVM执行流程

三、Java代码编译和执行的整个过程

Java代码编译是由Java源码编译器来完成,流程图如下所示:

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:

四、总结

Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。

程序开始执行时他才运行,程序结束时他就停止。你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机。

Java虚拟机总是开始于一个main()方法,这个方法必须是公有、返回void、只接受一个字符串数组。在程序执行时,你必须给Java虚拟机指明这个包括main()方法的类名。 Main()方法是程序的起点,他被执行的线程初始化为程序的初始线程。程序中其他的线程都由他来启动。

Java中的线程分为两种:守护线程(daemon)和普通线程(non-daemon)。守护线程是Java虚拟机自己使用的线程,比如负责垃圾收集的线程就是一个守护线程。当然,你也可以把自己的程序设置为守护线程。包含Main()方法的初始线程不是守护线程。

只要Java虚拟机中还有普通的线程在执行,Java虚拟机就不会停止。如果有足够的权限,你可以调用exit()方法终止程序。

这大概是一篇最简单最清晰的Java JVM执行流程相关推荐

  1. spring简单入门,入门案列的执行流程,图例

    1.入门案例的执行流程 1.1:  当启动了tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatchServlet对象,就会加载springmvc.xml配置 ...

  2. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  3. SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务) 一.大致介绍 微服务与微服务之间通过 ...

  4. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇-UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  5. iOS开发拓展篇—CoreLocation简单介绍

    iOS开发拓展篇-CoreLocation简单介绍 一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 ...

  6. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇-Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  7. 「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

    [mysql优化专题]:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么. 优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以 ...

  8. SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群...

    2019独角兽企业重金招聘Python工程师标准>>> SpringCloud(第 054 篇)简单 Quartz-Cluster 微服务,采用注解配置 Quartz 分布式集群 一 ...

  9. ocbase 数据库 蚂蚁_iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇-FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

最新文章

  1. Python算法题----求出和为S的所有连续正整数数列
  2. ML之xgboost:利用xgboost算法对breast_cancer数据集实现二分类预测并进行graphviz二叉树节点图可视化
  3. C# 连接Oracle(利用ODP.net,不安装oracle客户端)
  4. NBU网络备份大全之oracle系统冷备份
  5. 需求澄清_澄清字符串的格式!
  6. mysql高级操作_MySQL数据库的高级操作
  7. DBA日常管理——数据归档(Archiving-Data)
  8. 手把手教你写一个RPC
  9. javaScript常见的五种数组去重(转载)
  10. linux 网桥配置命令:brctl
  11. 微信小程序自定义导航栏
  12. PPT中插入图片背景透明化小技巧
  13. python正弦波叠加方波_电赛初探(一)——正弦波、方波、锯齿波转换
  14. 【水题】CodeForce 1183A
  15. 计算机无法识别华为usb设备,华为路由A1插上USB储存设备无法识别怎么办
  16. 用 JAVA 实现画板
  17. RN 在Android Studio运行闪退后报错
  18. python大数据作业-客户价值分析-实训头歌
  19. Vue的生命周期详解,一文带你弄懂Vue的生命周期
  20. three.js旋转,材质,灯光使用 —— 太阳地球月亮运动

热门文章

  1. 被忽视的Web安全漏洞:如何识别和解决?
  2. CCF NOI1010 邮寄包裹
  3. 两道关于JS的小考题(闭包与中间件)
  4. 技术文:微信小程序和服务器通信-WebSocket
  5. 通过severlet获取请求头信息
  6. 【VMCloud云平台】私有云门户第一朵Web云(三)
  7. 给select设置默认值,在option在页面上已经写死的情况下
  8. XenApp 6.0/6.5服务优化
  9. 泛型与操作符重载杂谈
  10. FreeJTS部标视频平台:JT/T808、JT/T809、JT/T796、JT/T794、JT/T1078、苏标ADAS的区别