天天看点

【搞定JVM】开篇:JVM介绍与知识脉络梳理

转发自:https://blog.csdn.net/a724888/article/details/77992936

前言:

JVM(Java Virtual Machine):Java 虚拟机是整个 java 平台的基石,是 java 系统实现硬件无关与操作系统无关的关键部分,是保障用户机器免于恶意代码损害的屏障。Java开发人员不需要了解JVM是如何工作的,**但是,**了解 JVM 有助于我们更好的开(通)发(过) java(公司) 程(面)序(试)。

 写这篇文章的目的:

  • 总结所学的 JVM 知识
  • 帮助想了解 JVM 的朋友,知无不言,言无不尽

本篇文章将会介绍一下内容:

一、什么是JVM

二、JVM用来做什么事情

三、JVM生命周期

四、JVM的整体架构

五、文章推荐

一、什么是JVM

要想说明白什么 JVM 就不得不提另外两个概念,JRE 和 JDK,初学者总是把这几个概念搞混。

【搞定JVM】开篇:JVM介绍与知识脉络梳理

Jvm,Jre,Jdk 都是 java 语言的支柱,他们分工协作。但不同的是 Jdk 和 Jre 是真实存在的,而 Jvm 是一个抽象的概念,并不真实存在。

JDK:

        JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。JDK 物理存在,是 programming tools、JRE 和 JVM 的一个集合。如下图所示:

【搞定JVM】开篇:JVM介绍与知识脉络梳理

JRE:

        JRE(Java Runtime Environment)Java 运行时环境,JRE 物理存在,主要由Java API 和 JVM 组成,提供了用于执行 java 应用程序最低要求的环境。

【搞定JVM】开篇:JVM介绍与知识脉络梳理

Jvm:

JVM(Java Virtual Machine) 是一种软件实现,执行像物理机程序的机器(即电脑)。

本来,Java被设计基于从物理机器分离实现WORA( 写一次,随处运行 )的虚拟机上运行,虽然这个目标已经几乎被遗忘。

JVM 并不是专为 Java 所实现的运行时,实际上只要有其他编程语言的编译器能生成正确 Java bytecode 文件,则这个语言也能实现在JVM上运行。

因此,JVM 通过执行 Java bytecode 可以使 java 代码在不改变的情况下运行在各种硬件之上。

JVM 有如下特点:

(1)基于堆栈的虚拟机 :最流行的计算机体系结构,如英特尔X86架构和ARM架构上运行基于寄存器 。 但是,JVM是基于栈的;

(2)符号引用 :除了基本类型以外的数据(类和接口)都是通过符号来引用,而不是通过显式地使用内存地址来引用;

(3)垃圾收集 :一个类的实例是由用户明确创建的代码和垃圾回收自动销毁;

(4)通过明确界定的基本数据类型的保证平台的独立性 :传统的语言,如C / C ++根据平台有不同的int型的大小。 JVM中明确规定了基本数据类型,以保持它的兼容性和保证平台的独立性;

(5)网络字节顺序 :Java class文件用网络字节码顺序来进行存储:为了保证和小端的Intel x86架构以及大端的RISC系列的架构保持无关性,JVM使用用于网络传输的网络字节顺序,也就是大端。

**Java bytecode **

为了实现WORA,JVM使用Java字节码,java(用户语言)和机器语言之间的中间语言。

该Java字节码是部署Java代码的最小单位。

二、JVM用来做什么事情

基于安全方面考虑,JVM 要求在 class 文件中使用许多强制性的语法和机构化约束,但任意一门功能性语言都可以表示为一个能被 JVM 接受的有效的 class 文件。作为一个通用的、机器无关的执行平台,任何其他语言的实现者都可将 JVM 当作他的语言产品交付媒介。

JVM 中执行以下操作:

  • 加载代码
  • 验证代码
  • 执行代码
  • 提供运行环境

JVM 提供定义了:

  • 存储区
  • 类文件格式
  • 寄存器组
  • 垃圾回收堆
  • 致命错误报告等

三、JVM生命周期

  • 启动:任何一个拥有main函数的class都可以作为JVM实例运行的起点
  • 运行:main函数为起点,程序中的其他线程均有它启动,包括daemon守护线程和non-daemon普通线程。daemon是JVM自己使用的线程比如GC线程,main方法的初始线程是non-daemon。
  • 消亡:所有线程终止时,JVM实例结束生命。

四、JVM的整体架构

先看一下Java代码的执行过程:

【搞定JVM】开篇:JVM介绍与知识脉络梳理

五、文章推荐

1、Jvm系列(一):java类的加载机制

第一篇文章讲的是Java类的加载机制,也是我在博客园最收欢迎的Jvm文章,读完之后你会了解什么是类加载器、类加载机制、双亲委派模型等内容。

2、Jvm系列(二):JVM内存结构

这篇文章描述了Java虚拟机的内存结构,内存每个区域作用,如何通过参数对各个区域进行控制。

3、Jvm系列(三):GC算法 垃圾收集器

讲述了Jvm垃圾回收的经典算法,以及各种垃圾回收机制,对象存活判断等。

4、Jvm系列(四):jvm调优-命令篇

这篇文章讲述了如何通过Jvm命令去调优,各Jvm命令使用方法。

5、Jvm系列(五):Java GC分析

这是非常有名的一张图,简单明了展示了GC日志的构成

文章介绍如何分析GC日志来诊断Java项目的运行状态,GC分析是生产调优的重要手段之一。

6、Jvm系列(六):Java服务GC参数调优案例

一名网友根据GC日志,进行Jvm调优的经典案例

7、Jvm系列(七):jvm调优-工具篇

介绍了Jvm调优各种工具的使用

8、Jvm系列(八):jvm知识点总览

如何你只是想通过面试,其实只要看一篇就够了,这篇文章将Jvm中的关键知识点进行了汇总。

9、Jvm系列(九):如何优化Java GC

翻译自国外的一篇Java GC文章,文章详细描述几种GC调优的方式,值得借鉴。

10、Jvm系列(十):教你如何成为Java的OOM Killer

也是线上一场线上Jvm实战调优的经历,看着挺爽。

11、Jvm系列(十一):Java 8-从持久代到metaspace

Java 8 Jvm内存变化。

12、Jvm系列(十二):Java 8的新特性—终极版

杜琪翻译的 Java 8 的新特性。

13、一个脚本引发的血案

我们曾经线上出现事故后,定位分析的经历,结局出乎意料。