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个步骤

  1. .java源文件编译为.class字节码文件
  2. JVM将.class字节码文件编译为操作系统的机器码
  3. 机器码调用操作系统本地方法库的方法

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

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。