Jvm总览

2016/01/01 JVM

JVM总览

什么是JVM(Java虚拟机)?什么是Java语言?两者又有何关系?我们为什么要学习JVM?从那些方面学习JVM?下面就让我们进入JVM世界的学习。 本文将主要介绍有关Java虚拟机的基本概念、实现概要。其中,将重点介绍支撑Java世界的两份重要规范—Java语言规范和Java虚拟机规范,帮助读者更好地理解Java生态圈。 本文涉及的主要知识点有:

  • 读懂Java的发展历史。
  • 学习Java虚拟机的概念和种类。
  • 接触Java语言规范。
  • 了解Java虚拟机规范。
  • 掌握单步调试Java虚拟机的方法。

我们为什么要学习JVM

学习虚拟机并不仅仅在于面试,而在于更深入地理解 Java 这门语言,以及为未来排查线上问题打下基础。 对于 Java 程序员来说,JVM 帮助我们做了很多事情比如内存管理、垃圾回收等等。万一你在工作中遇到了 OOM 问题,你至少要知道如何去排查和解决问题吧! 学习JVM我们带着下面的问题学习?

  • 什么是虚拟机?
  • Java 内存区域是怎么划分的?大对象放在哪个内存区域?
  • 垃圾回收有哪些算法?GC 的流程什么?
  • 什是类加载?何时类加载?类加载流程?知道哪些类加载器。类加载器之间的关系?类加载器的双亲委派了解么?
  • 常见调优参数有哪些?
  • 如何查看GC日志,并排查线上问题

理解Java虚拟机的原理

参考JVM规范官方文档https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-1.html

The Java Virtual Machine (JVM) is an abstract computing machine. The JVM is a program that looks like a machine to the programs written to execute in it. 
This way, Java programs are written to the same set of interfaces and libraries. Each JVM implementation for a specific operating system, 
translates the Java programming instructions into instructions and commands that run on the local operating system. This way, Java programs achieve platform independence.
(Java虚拟机(JVM)是一种抽象的计算机器。JVM是一个程序,对于编写在其中执行的程序来说,它看起来像一台机器。通过这种方式,Java程序被写入相同的接口和库集。
针对特定操作系统的每个JVM实现都将Java编程指令转换为在本地操作系统上运行的指令和命令。通过这种方式,Java程序实现了平台独立性。)

所谓虚拟机,就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。

大名鼎鼎的Visual Box、VMware就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。

程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。

到底什么是Java 虚拟机?其实 Java 虚拟机就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的机器码,确保字节码文件能在各个系统正确运行。

Java虚拟机的种类

Java发展至今,先后出现了不少Java虚拟机。在Java发展最初,Sun使用的是一款叫作Classic的Java虚拟机,之后,在Solaris平台上还曾短暂地使用过Exact VM虚拟机,到现在,最终被大规模部署和应用的是Hotspot虚拟机。

除了Sun公司,各大公司及组织都曾积极研发过Java虚拟机,比如BEA的JRockit,目前,JRockit和Hotspot都被收入Oracle旗下,大有整合的趋势。在IBM内部,使用着一款名为J9的虚拟机,广泛用于IBM的各大产品(如果当年IBM成功收购了Sun,那么很可能是J9和Hotspot进行整合了)。此外,Apache也曾经推出过与JDK 1.5和JDK 1.6 兼容的Java运行平台Apache Harmony,它是开源软件,但受到同样开源的OpenJDK的压制,最终于2011年退役,虽然目前并没有Apache Harmony被大规模商用的案例,但是它的出现对Android的发展起到了极为重要的作用。在嵌入式领域,KVM和CDC/CLDC Hotspot两款虚拟机也扮演着重要的角色,在iOS和Android盛行之前,这两款虚拟机也广泛运用于手机平台。

注意: 由于目前Hotspot占有绝对的市场地位,若无特别说明,本书的示例及参数都是针对Hotspot虚拟机的。

Java语言规范

讲到Java虚拟机,就不得不说Java,说到Java,就不得不提Java语言规范(Java Language Specification)。Java语言规范和Java虚拟机规范目前都可以在Oracle的官方网站上找到(http://docs.oracle.com/javase/specs/)。

Java语言规范是用来描述Java语言的,它定义了Java语言的语言特性,比如Java的语法、词法、支持的数据类型、变量类型、数据类型转换的约定、数组、异常等内容。Java语言规范的目的是告诉开发人员“Java代码应该如何编写”。

Java虚拟机规范

虽然Java语言和Java虚拟机有着密切的联系,但两者是完全不同的内容。Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成,像Groovy、Scala等语言生成的Java字节码也可以由Java虚拟机执行。立足于Java虚拟机,可以产生各种各样的跨平台语言。除了语言特性各不相同,它们可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器。

因此,与Java语言不同,Java虚拟机是一个高效的、性能优异的、商用级别的软件运行和开发平台。

Java虚拟机规范的主要内容大概有以下几个部分:

  • 定义了虚拟机的内部结构。
  • 定义了虚拟机执行的字节码类型和功能。
  • 定义了Class文件的结构。
  • 定义了类的装载、连接和初始化。

以Java 1.7为例,读者可以在http://docs.oracle.com/javase/specs/jvms/se7/html/浏览虚拟机规范全文。这份规范可以说是Java虚拟机的指导性文件,如果要实现自定义的Java虚拟机,则需要参考和熟悉这份规范,同时这份规范对于了解现存的流行Java虚拟机(如Hotspot、IBM J9等),也有十分重要的意义。

编译和调试虚拟机

如果要对虚拟机进行深入的研究,那么编译和调试Java虚拟机是必不可少的。为何要编译自己的虚拟机呢?主要原因有两点。

第一,通过自己编译可以得到一个debug或者fastdebug版本的调试用虚拟机,调试用虚拟机可以支持更多的虚拟机参数,这些开发专用的虚拟机参数可以帮助开发人员获得更多的虚拟机内部信息,而这些参数在正常发行版本中是无法使用的。因此考虑到本书的实用性,本书并不会过多介绍那些只在调试版本中使用的参数,但如果读者有兴趣,可以编译自己的虚拟机,进行尝试。

第二,使用自己编译的调试版虚拟机可以进行虚拟机代码的单步调试,有利于实现对虚拟机代码的理解。由于虚拟机代码比较复杂,仅通过代码阅读很难深入理解其实现机制,有时不得不依靠单步调试,而编译后调试版本可以帮助你实现这一功能。

为编译虚拟机,首先必须获得虚拟机源码,读者可以使用下面的命令获取JDK10的源码。推荐读者使用较新的版本,因为老版本的编译脚本可能在某些平台上存在问题。

参考资料

JVM官网https://docs.oracle.com/javase/specs/jvms/se8/html/index.html

周志朋《深入理解Java虚拟机:JVM高级特性与最佳实践》

Tim Lindholm 、Frank Yellin、Gilad Bracha 、Alex Buckley 《 java虚拟机规范 Java Se8》

高翔龙《java 虚拟机精讲》

张秀宏 《自己动手写 java虚拟机》

《Java性能权威指南》

《实战JAVA虚拟机 JVM故障诊断与性能优化》

《虚拟机设计与实现:以 JVM 为例》

《zachaxy 的手写 JVM 系列》

RednaxelaFX资料https://zhuanlan.zhihu.com/p/25042028?spm=a2c6h.12873639.article-detail.7.456f4766wUpwvq

JVM怎么学习啊https://www.zhihu.com/question/20097631

Search

    微信好友

    博士的沙漏

    Table of Contents