Java虚拟机简介
做Java开发的都知道JVM(Java Virtual Machine),即Java虚拟机,简单来讲,它是用来运行Java程序的。经过一系列的发展,目前市场上有很多的JVM,最流行或者说使用最广泛的莫过于HotSpot了,它诞生于JDK1.2,使用至今。
JVM作为JDK的核心组成部分,随着JDK的版本一起发布的,不同的JDK版本中,可能存在不同的JVM,有时会出现多个JVM共存。下面是SUN/Oracle JDK中的JVM的发展历史
- Classic VM
1996年1月,JDK1.0版本发布,这个版本的Java虚拟机是Classic VM。
- HotSpot VM
1998年12月,JDK1.2版本发布。1999年4月,HotSpot虚拟机诞生,它是被SUN公司从另外一家小公司收购而来,此时它仅作为JDK1.2版本的附加程序,并非默认的虚拟机。2000年5月,JDK1.3版本发布,HotSpot VM称为默认的虚拟机。
- Exact VM
在JDK1.2版本中,先后曾并存过3个虚拟机,Classic VM,HotSpot VM,以及Exact VM,其中Exact VM只在SUN公司自己的Solaris平台上使用,它与HotSpot VM几乎是同时期的独立产品。
- Graal VM
2018年3月,JDK10发布。4月,Oracle公司公开的一款虚拟机Graal VM,它是在HotSpot基础上诞生的,符合Java SE 8标准的JVM,但目前还未整合进JDK中发布,有可能是下一代的JVM。
JVM的运行流程大致如下3个步骤
- .java源文件编译为.class字节码文件
- JVM将.class字节码文件编译为操作系统的机器码
- 机器码调用操作系统本地方法库的方法
JVM主要由4部分构成,如下示意图
- 类加载器子系统
用于将编译好的.class字节码文件加载到JVM中
- 运行时数据区
用于存储JVM运行过程中产生的数据,包括程序计数器、本地方法区、方法区、虚拟机栈、虚拟机堆
- 执行引擎
包括即使编译器和垃圾回收器。即时编译器用于将.class字节码编译成操作系统的机器码,垃圾回收器用于回收在运行过程中产生的不再使用的对象
- 本地接口库
用于调用操作系统的本地方法库,以完成具体的I/O操作。
JVM核心组成
在一个JVM进程中,允许同时并发多个线程执行任务。在JVM后台运行的线程主要有以下5类
- 虚拟机线程
此类线程在JVM到达安全点时出现。
- 周期性任务线程
即执行周期性任务而创建的定时器调度线程。
- 编译器线程
编译器线程会在JVM运行时,执行将字节码动态编译成操作系统机器码的任务
- 信号分发线程
接收发送给JVM的信号并调用JVM的方法
- GC线程
用来在JVM中回收垃圾的线程
JVM(Java虚拟机)从0到1全部合集,强烈建议收藏
JVM(Java虚拟机)现在已经属于Java面试的重灾区,大厂面试现在基本属于必考内容,建议大家需要重点掌握。
为了方便大家更好的掌握好JVM(Java虚拟机),也为了让知识更系统化,这里我单独把JVM的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人。
完整文档,到文末获得
这篇文章重点讲了以下几点:
- JVM内存结构
- 堆内存(Heap)
- 方法区(Method Area)
- 虚拟机栈(JVM Stack)
- 本地方法栈(Native Stack)
- 程序计数器(PC Register)
- 直接内存
- JVM内存参数设置
- 典型JVM参数配置
这篇主要讲了以下几点:
- 标记清除
- 复制算法
- 标记整理
- 分代收集算法
这篇主要讲了以下几点:
常见的垃圾收集器有3类1.新生代的收集器包括:2.老年代的收集器包括:3.回收整个Java堆(新生代和老年代)
新生代垃圾收集器1.Serial串行收集器-复制算法2.ParNew收集器-复制算法3.Parallel Scavenge(并行回收)收集器-复制算法
老年代垃圾收集器1.Serial Old 收集器-标记整理算法2.Parallel Old 收集器-标记整理算法3.CMS收集器-标记清除算法
新生代和老年代垃圾收集器G1收集器-标记整理算法G1收集器的优势:G1收集器的运作步骤
这篇重点讲了以下几点:
- JVM内存调优
- JVM性能调优方法和步骤
- JVM调优参数参考
这篇重点讲了以下几点:
- 什么场景需要JVM调优
- JVM性能监控分析工具
- VisualVM
- Jconsole
- MAT
- JVM内存泄漏分析
这篇重点讲了以下几点:
- Minor GC
- Major GC
- 分代GC
- Full GC
这篇重点讲了以下几点:
1.G1概述
2.G1堆内存
3.G1回收流程
4.G1 GC模式
5.G1推荐用例
以上我主要从JVM的内存结构,再到回收算法,再到垃圾收集器,GC方式与参数,以及性能调优、工具、以及步骤等对JVM进行了一个完整的详解,希望这个JVM系列能对你有所帮助。
Java虚拟机和Dalvik虚拟机有哪些区别和不同?
Dalvik是Google公司自己设计的用于Android平的虚拟机,它可以简单地完成进程隔离和线程管理,并且可以提高内存的使用效率。每一个Android应用程序在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解析下得以执行。
很多人都认为Dalvik虚拟机是一个Java虚拟机,因为Android开发的编程语言恰恰是Java语言,但是这种说法并不准确。Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者不兼容,而且也有很多不同之处。下面通过一个图进行对比说明,如下所示。
Java 虚拟机和Dalvik虚拟机
从图中可以看出,Java虚拟机和Dalvik虚拟机主要有两大区别:一是它们编译后的文件不同;二是它们基于的架构不同。具体如下:
1.编译后的文件不同
Java 虚拟机运行的是.class字节码文件,而 Dalvik 虚拟机运行的则是其专有的.dex文件。在Java程序中Java类会被翻译成一个或者多个字节码文件(.class)然后打包到.jar文件,之后Java虚拟机会从相应的.class文件和.jar文件中获取相应的字节码。Android程序虽然也是使用Java语言进行编程,但是在翻译成.class文件后,还会通过工具将所有的.class文件转换成一个.dex文件,然后Dalvik虚拟机从其中读取指令和数据,最后的.odex是为了在运行过程中进一步提高性能而对.dex文件进行的进一步优化,能加快软件的加载速度和开启速度。
2.基于的架构不同
Java虚拟机是基于栈的架构,大家知道,栈是一个连续的内存空间,取出和存入的速度比较慢;而Dalvik是基于寄存器的架构,寄存器是CPU上的一块缓存,寄存器的存取速度要比从内存中存取的速度快很多,这样就可以根据硬件最大限度地优化设备,更适合移动设备的使用。
需要说明的是,Android系统下的Dalvik虚拟机默认给每一个应用程序最多分配16 MB内存,如果Android加载的资源超过这个值,就会报出OutOfMemoryError异常,因此一定要注意这个问题。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。