1.一个程序在 JVM 中运行的完整流程

java程序执行流程.JPG

说明:

① 类加载器把字节码加载到方法区

② 方法区的字节码被 JVM new,在堆内存中生成字节码对象

③ 字节码对象被 GC 的要求有:该类没有在其他任何地方被引用;该类的所有的实例对象都已被 GC;该类的类加载器的实例已被 GC

2.Java 虚拟机的生命周期

JVM 的生命周期可以分为启动、运行、退出。

(1) 启动

JVM 的启动过程是类加载,通过类加载器把二进制字节码加载到 JVM。

类加载器采用双亲委派模型, 其类型有 3 种:

① Bootstrap ClassLoader 启动类加载器:负责加载系统类和 /lib 目录的 jar 和类,例如 String

② ExtClassLoader 扩展类加载器:负责加载 /lib/ext 目录下的 jar 和类

③ AppClassLoader 应用程序类加载器:负责加载当前应用 ClassPath 的 jar 和类

④ UserDefinedClassLoader 用户自定义加载器:负责加载用户自定义的 jar 和类

示例如下,执行 main 方法,需要加载 Test01。根据双亲委派模型即向上检查、向下加载,JVM 从 AppClassLoader、ExtClassLoader 到 Bootstrap ClassLoader 检查和加载 Test01。Test01 是用户自定义类,Test01 没有指定父类即默认父类是 Object 类,被

AppClassLoader 加载。

public class Test01 {

public static void main(String[] args) {

System.out.println("123");

}

}

类的生命周期:

① 加载:通过全类名获取该类的二进制字节流、将字节流所代表的静态存储结构转换为方法区的运行时数据结构、在内存中生成一个代表该类的 Class 对象(方法区数据的访问入口);

② 验证:验证文件格式、字节码验证、魔数验证

③ 准备:分配内存给类变量,并设置类变量初始值。如果是基本数据类型,就会给他们设置默认值;

④ 解析:将常量池内的符号引用替换为直接引用

⑤ 初始化:new 指令、getstatic 指令、putstatic 指令、invokestatic 指令、 java.lang.reflect 的反射等

⑥ 使用:用户程序使用

⑦ 卸载:该类的所有的实例对象都已被GC、该类没有在其他任何地方被引用、该类的类加载器的实例已被GC

(2) 运行

一个JVM 进程的运行,实际上是 Java 程序的运行。当程序运行结束后,JVM 进程也就结束。

JVM 的守护线程:

Java 有 2 种进程,User Thread 用户线程、Daemon Thread 守护线程。例如,用户线程是指用户自定义的 main 函数,而守护线程是服务于用户线程的,例如 GC 垃圾回收线程。两种线程的生命周期是一致的,前者优先级高于后者的。

(3)退出

JVM 的退出有多种场景,如下所示。

① 程序正常结束运行

② 程序中调用 System.exit() 等方法

③ 程序运行过程中,遇到异常错误终止

④ 操作系统、硬件原因导致 JVM 进程被结束

java虚拟机1.7_《Java虚拟机原理》7.1 精选 —— 总览相关推荐

  1. 南邮java实验报告,南邮微机原理实验报告精选.doc

    南邮微机原理实验报告精选 <微型计算机原理与接口技术> 上机实验 学 院: 电子科学与工程 专 业: 电磁场与无线技术 姓 名: 陈秀慧 课 程 号: B0300062S 学 号: 任课老 ...

  2. java虚拟机工作原理图_Java虚拟机工作原理

    首先我想从宏观上介绍一下Java虚拟机的工作原理.从最初的我们编写的Java源文件(.java文件)是如何一步步执行的,如下图所示,首先Java源文件经过前端编译器(javac或ECJ)将.java文 ...

  3. Java虚拟机(一)结构原理与运行时数据区域

    前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟 ...

  4. JAVA虚拟机 安全区域_JVM虚拟机如何枚举根节点:原理、安全点和安全区域

    原标题:JVM虚拟机如何枚举根节点:原理.安全点和安全区域 枚举根节点--可作为GC Roots的节点 可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的 ...

  5. 写给Java程序员的Java虚拟机学习指南

    大家好,我是极客时间<深入拆解Java虚拟机>作者.Oracle Labs高级研究员郑雨迪.有幸借这个专题的机会,能和大家分享为何Java工程师要学Java虚拟机?如何掌握Java虚拟机? ...

  6. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  7. java 内存泄露 书籍_java虚拟机内存溢出和泄漏实例

    测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...

  8. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机...

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

  9. Java虚拟机(六)——虚拟机栈

    文章目录 虚拟机栈 虚拟机栈概述 出现背景: 优点 缺点 内存中的栈和堆 基本内容 Java虚拟机栈是什么 生命周期 作用 栈的优点 常见的错误有哪些 栈的存储单位 栈的运行原理 栈帧的内部结构 局部 ...

  10. 为什么虚拟机上一运行就显示程序停止_五分钟学Java:如何学习Java面试必考的JVM虚拟机||CSDN博文精选...

    作者:黄小斜 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java面试中总是爱考一类问题, ...

最新文章

  1. Hadoop2.7.3完全分布式搭建
  2. 【转:理论知识】SAP在建工程转固定资产
  3. 位数不足前面补0mysql语句_MySQL查询添加0到少于9位数字?
  4. XP系统,CMD窗口总是只显示最后一屏的信息,如何能让全部信息都显示出来呢??
  5. 2017.9.6数学
  6. 柳传志与马云绸缪宏观经济“冬天影子”
  7. 用C语言操作MySQL数据库
  8. 从Loagistic 到 SVM算法
  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 解组合指令
  10. Java 第五章 类的设计与包
  11. 天正多条线段长度lisp下载_预习丨人教版六年级数学(上册)全册知识要点梳理,可下载...
  12. SPOJ DQUERY D-query(主席树 区间不同数个数)
  13. c语言 由函数组成的数组,学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的_考题宝...
  14. CSS去除链接虚线(兼容IE6、IE7)
  15. 正则去除汉字和只取数字
  16. 终极算法---读书笔记
  17. DRV8833直流电机驱动模块代替 TB6612FNG电机驱动
  18. pandas安装了但是import不了
  19. python概率分布拟合_用Python实现概率分布
  20. 在vue.js中实现a标签href tel的打电话功能

热门文章

  1. ORACLE JOB 失败 查看,Oracle JOB异常中断原因分析
  2. 怎么挖linux内核的漏洞,linux内核漏洞分析实战看看专家是怎么一步步...-卓优商学院问答...
  3. python if语句 for语句 while语句
  4. txt文本变为粗体_如何在PHP中使文本变为粗体?
  5. java中intvalue_Java Short类intValue()方法及示例
  6. 回溯算法n皇后问题_使用回溯算法的N Queen问题和解决方案
  7. 嗯,查询滑动窗口最大值的这4种方法不错....
  8. 面试突击 002 | Redis 是如何处理已过期元素的?
  9. VC函数中的延时操作
  10. CentOS7 搭建Kafka消息队列环境,以及Python3操作Kafka Demo