【搞定JVM】开篇:JVM介绍与知识脉络梳理
转发自:https://blog.****.net/a724888/article/details/77992936
前言:
JVM(Java Virtual Machine):Java 虚拟机是整个 java 平台的基石,是 java 系统实现硬件无关与操作系统无关的关键部分,是保障用户机器免于恶意代码损害的屏障。
一、什么是JVM
要想说明白什么 JVM 就不得不提另外两个概念,JRE 和 JDK,初学者总是把这几个概念搞混。
Jvm,Jre,Jdk 都是 java 语言的支柱,他们分工协作。但不同的是 Jdk 和 Jre 是真实存在的,而 Jvm 是一个抽象的概念,并不真实存在。
JDK:
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。JDK 物理存在,是 programming tools、JRE 和 JVM 的一个集合。如下图所示:
JRE:
JRE(Java Runtime Environment)Java 运行时环境,JRE 物理存在,主要由Java API 和 JVM 组成,提供了用于执行 java 应用程序最低要求的环境。
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代码的执行过程:
五、文章推荐
第一篇文章讲的是Java类的加载机制,也是我在博客园最收欢迎的Jvm文章,读完之后你会了解什么是类加载器、类加载机制、双亲委派模型等内容。
这篇文章描述了Java虚拟机的内存结构,内存每个区域作用,如何通过参数对各个区域进行控制。
讲述了Jvm垃圾回收的经典算法,以及各种垃圾回收机制,对象存活判断等。
这篇文章讲述了如何通过Jvm命令去调优,各Jvm命令使用方法。
这是非常有名的一张图,简单明了展示了GC日志的构成
文章介绍如何分析GC日志来诊断Java项目的运行状态,GC分析是生产调优的重要手段之一。
一名网友根据GC日志,进行Jvm调优的经典案例
介绍了Jvm调优各种工具的使用
如何你只是想通过面试,其实只要看一篇就够了,这篇文章将Jvm中的关键知识点进行了汇总。
翻译自国外的一篇Java GC文章,文章详细描述几种GC调优的方式,值得借鉴。
10、Jvm系列(十):教你如何成为Java的OOM Killer
也是线上一场线上Jvm实战调优的经历,看着挺爽。
11、Jvm系列(十一):Java 8-从持久代到metaspace
Java 8 Jvm内存变化。
杜琪翻译的 Java 8 的新特性。
13、一个脚本引发的血案
我们曾经线上出现事故后,定位分析的经历,结局出乎意料。