你是否也遇到过这些问题?
运行着的线上系统突然卡死,系统无法访问,甚至直接OOM!
想解决线上JVM GC问题,但却无从下手。
新项目上线,对各种JVM参数设置一脸茫然,直接默认吧,然后就JJ了
每次面试之前都要重新背一遍JVM的一些原理概念性的东西,然而面试官却经常问你在实际项目中如何调优JVM参数,如何解决GC、OOM等问题,一脸懵逼。
开发人员如何看待底层架构?
大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少。
一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。
如果我们把核心类库的 API 比做数学公式的话,那么 Java 虚拟机的知识就好比公式的推导过程。
计算机系统体系对我们来说越来越远,在不了解底层实现方式的前提下,通过高级语言很容易编写程序代码。但事实上计算机并不认识高级语言。
我们平时开发,反手就是一顿梭,CURD,快如流水。但,针对现有系统进行调优或者出去面试时,涉及底层JVM相关的知识却又知之甚少。
我们以面试的形式,来对JVM做一个简单的了解
面试题
0、什么是JVM?
指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现。常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM)
1、你能说出几种JVM?
Sun Classic VM
JDK1.0 第一款商业虚拟机。只能使用纯解释器来运行Java代码。
Exact VM
jdk1.2只在Solaris上发布了.Exact Memory Management 准确式子内存管理, 即:虚拟机可以知道内存中某个位置的数据具体是什么类型的。
Hot Spot VM
Java程序员耳熟能详的一款JVM,是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
KVM
Kilobyte VM,简单、轻量、高度可移植、运行速度慢,是一款嵌入式虚拟机。通常在手机平台运行。
JRockit
BEA公司(2008年被Oracle收购)研发。世界上最快的虚拟机,专注服务器端的应用。因为其不太关心程序的启动速度,内部不包含解释器的实现,全部代码都靠即时编译器编译后执行,所以性能高。
J9
IBMTechnology for java virtual Machine (IT4j)
Dalvik VM
Dalvik是冰岛的一个小渔村的名字。其本身并不是一个Java虚拟机,因为并不遵循Java虚拟机的规范,是不能直接执行编译后的**.class**文件。使用的是寄存器架构,而不是Java VM 所使用的栈架构。它执行的是 .dex(dalvik Execuable)文件。
Microsoft JVM
只能运行在windows平台上。1997年,Sun指控微软侵犯商标成功,微软赔了Sun公司很多钱,微软在windows XP SP3中抹除了其VM。现在windows安装的jdk都是HotSpot虚拟机。
Liquid VM
BEA 公司的一个产品。更加强大,不需要操作系统的支持,它自己就是一个操作系统。说Java慢,是因为它先经过一层Java VM,然后虚拟机来调用OS,多了一步。而Liquid VM本身就不需要OS的支持,它自己就已经实现了File System,网络支持等等这些必要的功能,本身就相当与一个OS。所以性能和速度都是相当强大的。
TaobaoJVM
淘宝公司根据HotSpot 深度定制的产品。
Graal VM
GraalVM是一款高性能的可嵌入式多语言虚拟机,它能运行不同的编程语言。GraalVM的核心是Graal编译器。Graal可以当作JIT编译器来使用,也可以用作提前编译的静态编译器。
其他JVM:Java Card VM、Squawk VM、JavaInJava、Maxine VM、Jikes RVM、IKVM.NET、Jam VM、 Cacao VM、Sable VM、Kaffe、Jelatine JVM、Nano VM、MRP、Moxie JVM
2、怎么理解Java是跨平台的语言,JVM是跨语言的平台?
Java是跨平台的语言
Java是跨平台的语言, 这里所说的跨平台是指经编译后的文件能否跨平台,而不是指源程序能否跨平台. 比如c语言是编译执行,生成的是可执行文件,依赖于编写时的平台,而Java语言是解释执行,编译生成的是字节码文件(.class文件),这是中间产物,不依赖于平台,最终是在Java虚拟机(JVM)上运行的,只要机器上有JVM就可以解释执行程序。
JVM是跨语言的平台
JVM是跨语言的平台,很多语言都可以编译成为遵守规范的字节码,这些字节码都可以在Java虚拟机上运行。Java虚拟机不关心这个字节码是不是来自于Java程序,只需要各个语言提供自己的编译器,字节码遵循字节码规范即可。
3、你能说说JVM整体结构吗?
这个架构可以分成三层看:
最上层:javac编译器将编译好的字节码class文件,通过java 类装载器执行机制,把对象或class文件存放在 JVM划分内存区域。
中间层:称为Runtime Data Area,主要是在Java代码运行时用于存放数据的,从左至右为方法区(永久代、元数据区)、堆(共享,GC回收对象区域)、栈、程序计数器、寄存器、本地方法栈(私有)。
最下层:解释器、JIT(just in time)编译器和 GC(Garbage Collection,垃圾回收器)
tip: 下面是更为详细的图解
4、说说JVM的生命周期
虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。
虚拟机的退出有如下的几种情况:
某线程调用Runtime类或System类的exit方法,或 Runtime类的halt方法,并且Java安全管理器也允许这次exit或halt操作。
程序正常执行结束
程序在执行过程中遇到了异常或错误而异常终止
由于操作系统出现错误而导致Java虚拟机进程终止