JVM入门介绍

JVM入门介绍

【摘要】JVM入门介绍。

前言

参考链接
写过C/C++程序的都知道,在内存管理方面,需要对所创建的每一个对象的创建到销毁负责。但是对于Java程序员来说,在虚拟机自动内存管机制下,我们不需要为每一个new操作去写相应的delete/free代码,不容易出现内存泄漏和内存溢出问题,由虚拟机管理内存这一切看起来都很美好。不过,也正是因为Java程序员把内存控制的权力交给了JVM,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。
在开始了解JVM之前,我们需要知道:

  • Java程序是运行在JVM上的。
  • JVM是使用c++编写的。
  • 一个Java程序是如何执行的?

JVM是什么?

首先,JVM是什么?JVM(Java Virtual Machine,Java虚拟机)。作为Java开发人员,我们一直在使用JVM,但是很少去关注JVM到底是怎么运行的。就像我们天天都使用手机,但却很少有人拆开手机看看里面到底是什么模样的。

  • JVM是一种用于计算设备的规范。
  • 它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。包括
    • 字节码指令集(汇编语言)
    • 内存管理:栈、堆、方法区等。
  • Some Oracle Documentation | JDK 13 Documentation

JVM–跨语言的平台

JVM跟Java语言无关,因为是JVM上运行的是class文件。换句话说,也就是任何语言只要能编译成符合特定语法的.class文件,你的程序就可以在JVM上运行。目前已经有很多语言可以通过编译成class文件在JVM上运行。如:Java、Scala、Kotlin、Groovy等。然而针对不同的操作系统平台,JVM又有不同的版本。

常见的几种JVM实现

目前已经有很多JVM的实现,下面是常见的几种:

  • HotSpot – Oracle官方的,我们做实验通常会使用这个。可以通过java -version查看。
  • Jrockit – BEA,曾经号称世界上最快的JVM,被Oracle收购,合并于HotSpot。
  • J9 - IBM
  • Microsoft VM
  • TaoBaoVM – HotSpot深度定制版。
  • LiquidVM – 直接针对硬件。
  • azul zing – 最新垃圾回收的业界标杆。azul官网

JDK、JRE和JVM的关系?

JVM,温故而知新

还记得当我们装好JDK,配置好环境变量之后,我们会在命令提示符输入java -version。我们以往只关心下面输出的内容只要不是“既不是内部也不是外部命令”这种错误提示,最多看一下jdk的版本号,也就默认是配置成功的。很少会去看下面两行的信息。

如上图,红框里面的HotSpot<TM>代表JVM的核心组件,或者可以说他说JVM的名称。jdk的每一次更新版本都会重点对某一问题进行优化。我们知道jvm每次加载class文件后,会把class文件转换为本地编码,频繁的加载class文件会消耗计算机资源,所以使用热点探测技术进行优化这个问题。就是在每一次在加载class文件的时候,会根据加载的class文件做标记,然后标记的过程中达到一定的阈值,会触发实时编译机制(Just In Time Compiler,JIT)。

其实虚拟机在启动时,为我们准备了两套不同的机制,一个是Client VM,另外一个就是红框中的Server VM来初始化自己。为了更加合理的使用内存,Client VM主要用来使用桌面级应用,而Server VM主要用来处理并发问题。

我们可以在JDK安装目录中找到虚拟机的配置文件。我的操作系统是64位的,在C:\Program Files\Java\jdk1.8.0_181\jre\lib\amd64\jvm.cfg,如果你使用的是32位系统上面amd64替换为i386

找到之后打开文件。可以看到文件下方有server和client两个,可以调整(谁在上面使用谁)使用哪个机制初始化虚拟机。(我这里client IGNORE所以不能改。)

结束语

通过上面的描述,知道了什么是JVM?下篇将走进JVM内部,带你了解她神秘面纱后面的娇艳欲滴。

评论