0. 前言
Java 作为一门面向对象的语言被广泛的使用,知名企业中大量使用Java的有Amazon,Linkedin,阿里,美团,搜狐;用的比较少的知名企业有百度,腾讯等,可以说凡是大企业都或多或少的有用到Java。一些被广泛使用的开源系统、框架也完全使用Java进行编写,比如Android操作系统和Hadoop分布式系统基础框架。为什么Java会收到欢迎?除了其本身面向对象的特性极大的加快了开发效率这个表面原因,另一个重要的原因就是Java 虚拟机 (Java Virtual Machine)的存在,为程序提供了一个稳定健壮的运行环境。
Kanarien:
其实我们Java程序员每天都用Java写程序,却很少有人会去了解这门语言的内在,毕竟重于计算机是一门实践性科学(整天敲代码)。应该找个空闲的时间来了解一下Java的底层架构,毕竟计算机科学同时也是一门理论性的学科(一堆的专业书),是时候向Java高级方面迈进了!嘛,其实本人之所以会想了解JVM,原因还在于Java虚拟机与Java并发编程同时也是当今大数据时代的基础知识,是很重要的底层知识,顺应时代的潮流,我们有这个必要性去了解。
该系列笔记结合了本人所学的知识,并参考了以下文章:
- Java 虚拟机面试题全面解析(干货) - CSDN博客
- 理解Java虚拟机体系结构 - LeoLiang - 博客园
- JVM内存堆布局图解分析 - Sara早安 - 博客园
- Java垃圾回收机制 - CSDN博客
- 图解Java 垃圾回收机制 - CSDN博客
该系列笔记也借阅了书籍《深入理解Java虚拟机》,这里提供个人的pdf下载地址:《深入理解Java虚拟机》
Java 虚拟机概述
1. 任务概述
Java虚拟机的主要任务是装载class文件并且执行其中的字节码。由下图可以看出,Java虚拟机包含一个类装载器(class loader),它可以从程序和API中装载class文件,Java API中只有程序执行时需要的类才会被装载,字节码由执行引擎来执行。
当Java虚拟机由主机操作系统上的软件实现时,Java程序通过调用本地方法和主机进行交互。Java方法由Java语言编写,编译成字节码,存储在class文件中。本地方法由C/C++/汇编语言编写,编译成和处理器相关的机器代码,存储在动态链接库中,格式是各个平台专有。所以本地方法是联系Java程序和底层主机操作系统的连接方式。
由于Java虚拟机并不知道某个class文件是如何被创建的,是否被篡改一无所知,所以它实现了一个class文件检测器,确保class文件中定义的类型可以安全地使用。Class文件检验器通过四趟独立的扫描来保证程序的健壮性(详细见笔记三 类加载——连接之验证)
Java虚拟机在执行字节码时还进行其它的一些内置的安全机制的操作,他们作为Java编程语言保证Java程序健壮性的特性,同时也是Java虚拟机的特性:
- 类型安全的引用转换
- 结构化的内存访问
- 自动垃圾收集
- 数组边界检查
- 空引用检查
2. 功能特性
write once, run anywhere 一次编译, 到处运行
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java的无关性特性,准确的说应该是Java虚拟机的无关性特性,包括平台无关性与语言无关性,是建立在字节码(ByteCode)的基础之上的。平台无关性是指Java程序可以运行在任一种操作系统(平台)上,屏蔽了与具体操作系统平台相关的信息,即所谓的”Write Once, Run Anywhere”。语言无关性是指Java虚拟机并不与包括Java语言在内的任何语言绑定,虽然很多程序员认为在Java虚拟机上运行Java程序是理所当然和天经地义的,但Java虚拟机实际上只和Class文件这种特殊的二进制文件关联(笔记五有介绍Class文件)。而且字节码比起Java语言具有更加强大的语言描述能力。
3. Java 虚拟机的生命周期
启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。
Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序。而这个main()方法必须是共有的(public)、静态的(static)、返回值为void,并且接受一个字符串数组作为参数。任何拥有这样一个main()方法的类都可以作为Java程序运行的起点。
在以下几种情况下,Java 虚拟机将结束生命周期。
- 执行了System.exit()方法
通过查看api文档,我们exit的参数为int,当参数为0就是正常结束,否则就是非正常结束。 - 程序正常结束
- 程序执行过程中遇到异常或错误
- 操作系统出现错误
4. Java虚拟机与Java程序
Java程序的执行依赖于编译环境和运行环境。源码代码转变成可执行的机器代码,由下面的流程完成:
Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行。Java程序的运行需要Java虚拟机、Java API和Java Class文件的配合。Java虚拟机实例负责运行一个Java程序。当启动一个Java程序时,一个虚拟机实例就诞生了。当程序结束,这个虚拟机实例也就消亡。
Java的跨平台特性,因为它有针对不同平台的虚拟机(同1.2所说)。
5. 虚拟机与物理机
虚拟机是一个相对于物理机的概念,两种机器都具有执行代码的能力。区别在于物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统上的,而虚拟机的执行引擎是自己实现的,可自行定义指令集与执行引擎的结构体系。
6. Java虚拟机的实现方式
Java虚拟机的实现方式有两种:
- 将输入的Java虚拟机的代码在加载或执行时翻译成另一种虚拟机的指令集。
- 将输入的Java虚拟机的代码在加载或执行时翻译成宿主机CPU的本地指令集
Copyright © 2018, GDUT CSCW back-end Kanarien, All Rights Reserved