1 JVM在java平台中的位置

1.1 Java平台组成

Java平台主要由Java虚拟机和Java API这两部分组成。参考Oracle官网

1.2 java平台结构图

JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心的Java库甚至也可以操作底层的硬件平台,从而大大提升了Java的执行效率。JDK1.2之后的整个java平台如下图所示:

1.3 JVM与JRE、JDK的关系

参照Oracle官网的介绍可知,JVM与JRE、JDK的关系如下:

JVM:负责执行符合规范的Class文件。

JRE:包含JVM与类库。

JDK:包含JRE与一些开发工具,如javac、javap等。

1.4 java虚拟机在整个程序流程中的位置

2 JVM的体系结构

2.1 什么是虚拟机

模拟执行某种指令集体系绌构的软件。有多种分类,比如进程虚拟机(高级语言虚拟机),系统虚拟机,协设计虚拟机。

2.2什么是Java虚拟机

(1)有多层含义:

  • 一套规范:Java虚拟机规范,定义概念上Java虚拟机的行为表现。
  • 一种实现:例如HotSpot、J9、JRockit。需要实现JVM规范,但具体实现方式不需要与“概念中”的JVM一样。
  • 一个运行中的实例:某个JVM实现的某次运行的实例。

(2)只要输入符合规范的Class文件即可执行。

(3)并非一定要执行“Java”程序,可以支持其他语言,比如Groovy,Jython等。

2.3 概念中JVM体系结构

2.4 JVM的内部体系结构分为三部分

(1)类装载器(ClassLoader)子系统

作用:用来装载.class文件。

(2)执行引擎

作用:执行字节码,或者执行本地方法。

(3)运行时数据区

方法区,堆,java栈,PC寄存器,本地方法栈。

3 JVM的生命周期

3.1 两个概念:JVM实例和JVM执行引擎实例

(1)JVM实例对应了一个独立运行的java程序,它是进程级别。

(2)JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的。

3.2 JVM的生命周期

(1)JVM实例的诞生

当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点。

(2)JVM实例的运行

main()作为该程序初始线程的起点,任何其他线程均由该线程启动。

JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。

(3)JVM实例的消亡

当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。

4 Class文件

4.1 Class文件所记录的信息

(1)结构信息

  • Class文件格式版本号
  • 各部分的数量与大小

(2)元数据

  • 类/ 继承的超类/ 实现的接口的声明信息
  • 域与方法声明信息
  • 常量池
  • 用户自定义的、RetentionPolicy为CLASS或RUNTIME的注解
  • ——对应Java源代码中“声明”与“常量”对应的信息

(3)方法信息

  • 字节码
  • 异常处理器表
  • 操作数栈与局部变量区大小
  • 操作数栈的类型记录(StackMapTable,Java 6开始)
  • 调试用符号信息(如LineNumberTable、LocalVariableTable)
  • ——对应Java源代码中“语句“与“表达式”对应的信息

4.2 class文件不只是字节码

字节码只代表程序逻辑,只是Class文件众多组成部分其中之一。

参考资料

莫枢JVM技术分享PPT。

淘宝应届生培训 JVM工作原理PPT。

http://yhjhappy234.blog.163.com/blog/static/3163283220122204355694/

JVM学习笔记:JVM的体系结构与JVM的生命周期的更多相关文章

  1. 《深入Java虚拟机学习笔记》- 第7章 类型的生命周期/对象在JVM中的生命周期

    一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令 ...

  2. React 学习笔记(1) 基础语法和生命周期

    参看:视频地址 简单搭建一个react-cli: 2. React.createElement() 将object转化为 React语法 import React from 'react' impor ...

  3. JVM学习笔记(一):JVM初探

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第一章 本文是第一章的一些笔记整理. 2 Java里程碑 2.1 Java起源 1990年Sun公司决定开发一 ...

  4. JVM学习笔记(三):JVM基本参数

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...

  5. JVM学习笔记(二):JVM基本结构

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第二章 本文是第二章的一些笔记整理. 2 JVM基本参数-Xmx java命令的一般形式如下: java [- ...

  6. Android学习笔记(十五)——碎片的生命周期(附源代码)

    碎片的生命周期 点击下载源代码 与活动类似.碎片具有自己的生命周期.理解了碎片的生命周期后.我们能够在碎片被销毁时正确地保存事实上例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Frag ...

  7. vue学习笔记(四)——Vue实例以及生命周期

    1.Vue实例API 1.构造器(实例化) var vm = new Vue({ //选项 |-------DOM(3) |   |-------el (提供一个在页面上已存在的 DOM 元素作为 V ...

  8. Java框架spring 学习笔记(三):Bean 的生命周期

    当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态.当bean不再需要,并且从容器中移除时,需要做一些清除工作.为了定义安装和拆卸一个 bean,我们只要声明init-metho ...

  9. JS学习笔记(4)--js变量的生命周期

    http://www.cnblogs.com/williamxiao/p/3499973.html 最近看国外经典教材的时候发现JavaScript与熟知的Java,C,C++都不同的特性,其中一个就 ...

  10. Servlet学习笔记04——什么是重定向,servlet生命周期?

    1.重定向 (1)什么是重定向? 服务器通知浏览器访问一个新的地址. 注: 服务器可以通过发送一个302状态码及一个 Location消息头(该消息头的值是一个地址,一般 称之为重定向地址)给浏览器, ...

随机推荐

  1. 查看Mysql实时执行的Sql语句

    最近给客户开发了基于Asp.Net mvc5 +Mysql+EF的项目,但是在EF里无法看到Mysql执行的语句 之前也找到一些监控Mysql的软件但一直没有用起来,现在又遇到了问题即在EF里Mysa ...

  2. php配置rewrite模块

    转 (1)    启用rewrite模块,在默认情况下,没有启用 修改httpd.conf文件 #启动rewrite模块 LoadModule rewrite_module modules/mod_r ...

  3. Windows 提高效率的常用快捷键

    开发中减少使用鼠标次数,是一个很cool的体验!下面的快捷键在Win7上测试有效 快捷键 说明 Ctrl+Shift+N 创建一个新的文件夹. (Ctrl + N  打开桌面) Ctrl+Shift+ ...

  4. Java7并发编程实战(一) 守护线程的创建和运行

    Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,J ...

  5. Alpha版本发布说明

    软件发布的同时,在团队博客上写一个发布说明     ▪ 列出这一版本的新功能     ▪ 这一版本修复的缺陷     ▪ 对运行环境的要求     ▪ 安装方法     ▪ 描述系统已知的问题和限制 ...

  6. 创业这三年¥.NET之尴尬处境

    创业这三年#迈出第一步 创业这三年@各种奇遇 之前写的文章有兴趣的大家可以看看. 本来没有打算写这样一篇会遭人拍砖的文章,但是发现大家每天忙于编码,对市场环境..Net生态没有一个真实.多角度的认识, ...

  7. (404) 未找到 获取StatusCode状态码

    异常代码: (HttpWebResponse)req.GetResponse(); 当执行这段代码出现异常 解决问题 那如果我们想获得错误发生时候服务器段错误页面的源代码该如何做呢? 其实非常非常简单 ...

  8. 前端程序员应该知道的15个 jQuery 小技巧

    下面这些简单的小技巧能够帮助你玩转jQuery. 返回顶部按钮 预加载图像 检查图像是否加载 自动修复破坏的图像 悬停切换类 禁用输入字段 停止加载链接 切换淡入/幻灯片 简单的手风琴 让两个div高 ...

  9. redis的主从复制,读写分离,主从切换

    当数据量变得庞大的时候,读写分离还是很有必要的.同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能. redis提供了一个master,多个s ...

  10. .NET中的GDI+

    GDI:Graphics Device Interface. System. Windows. Shapes 命名空间: 类 Ellipse 绘制一个椭圆. Line 在两个点之间绘制一条直线. Pa ...