JVM(一)虚拟机基础

JVM 全称Java Virtual Machine,也就是我们耳熟能详的Java 虚拟机。它能识别.class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

Java执行流程

​当我们编写完程序之后文件就是.Java文件通过Javac指令编译之后就是.class文件,之后就是由JVM将类加载到方法区中,执行引擎执行这些字节码。

​过程如下:Java 文件->编译器>字节码->JVM->机器码

JVM的跨平台、跨语言性

  • 跨语言

    ​因为JVM是通过识别字节码(.class文件)的方式进行运行的,所以只要其他语言如果也可以编译为字节码文件则也可以在JVM上运行,例如:Groovy、Kotlin等等一些语言。所以JVM也是一定程度上奠定了Java强大的生态圈。

JVM相关实现

​JVM规范的存在提供了一些JVM的具体的实现。

  • Hotspot

    使用最多的Java虚拟机,通过javac -version的命令可以看到。

  • Jrocket

    原隶属于BEA公司,号称最快的JVM,后被Oracle所收购,与Hotspot所合并。

  • J9

    IBM公司的JVM,主要用于自家产品上(IBM WebSphere 和IBM 的AIX 平台)。

  • TaobaoVM

    淘宝根据HotSpot为自身定制的JVM,目前阿里、天猫都在使用。

  • zing

    属于zual公司,很牛,但是很贵。它的垃圾回收速度非常快,之后它的垃圾回收算法被HotSpot所吸收形成了现在的ZGC。

JVM 整体知识模块

​从下图中可以看到JVM的知识模块是比较多的,但是基本上都会与内存结构牵扯到一些关系,所以内存结构是非常重要的一块知识点。

JVM 内存区

​class文件初始化时会将初始化的数据存放到方法区和堆中,当调用方法的时候会生成一个线程,线程中会虚拟出一块内存,通过执行引擎执行指令集,操作数据进行入栈出栈以及程序计数器计数,最后返回地址,从而完成一个方法的调用。

  • 运行时数据区

    • 线程共享区
      • 方法区(规范,逻辑划分)

        方法区是JVM中的一种规范。JDK 1.7 是以永久代实现方法区,JDK 1.8是以元空间实现方法区的,所以存在不同的叫法。此区域是在class加载的时候就已经将数据加载到方法区中了。

        运行时常量池:主要存放引用地址。即在类加载的时候会存在将符号替换为直接引用的一部,其实就是将对象 a = new 对象()转换为对象 a = 地址,其地址就是存放在运行时常量池的。

      • 用于存放对象的。

    • 线程私有区
      • 线程

        此处每一个线程之间都是独立的、互不干扰的。每一个线程中都会存在三个大块—虚拟机栈、本地方法栈、程序计数器。

        虚拟机栈:主要核心为一个个栈帧,遵循栈的数据结构,先进后出。通过-Xss可以设置每个虚拟机栈的大小,一般默认为1MB(不同的操作系统默认设置的大小不一样)。每一个方法都会创建一个栈帧,直至方法执行结束则会出栈。

        局部变量:主要存放八大基本数据类型以及对象的引用。

        操作数栈:执行引擎的一个工作区,通过执行引擎执行指令集对数据进行入栈、出栈、计算等等。

        动态连接:后期文章。

        方法返回:将最终结果返回。

        本地方法:存放native所修饰的方法,因为这些方法都是由C/C++所实现的,可以通过此方法来操作系统。

        程序计数器:单独划分的一块内存,主要存放当前执行引擎所执行的地址。因为多线程的情况所以需要记录当前线程所执行的地址/行号,类似于CPU时间片轮转,它的内部也存在一个类似程序计数器。

        ​此区域是永远不会出现栈溢出异常。

  • 直接内存

    虚拟机内存以外的的内存,NIO可以操作此区域的内存。

    UnSafe类也可以,Ehcache就是基于此类实现的,但不建议自己使用。

(0)

相关推荐

  • JVM入门看着一篇就够了

    JVM入门看着一篇就够了

  • JVM虚拟机Class类文件研究分析

    前言 为了研究Class文件,先编写一个最简单的代码: package com.courage; public class T0100_ByteCode01 { } 之所以说最简单,是因为这个类里面任 ...

  • 2021最新 Java虚拟机(JVM)面试题精选(附刷题小程序)

    推荐使用小程序阅读 为了能让您更加方便的阅读 本文所有的面试题目均已整理至小程序<面试手册> 可以通过微信扫描(或长按)下图的二维码享受更好的阅读体验! 目录 推荐使用小程序阅读 1. J ...

  • Java跨平台原理与Java虚拟机(JVM)

    Java跨平台原理(字节码文件.虚拟机) C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.c ...

  • 一起来聊一聊JVM虚拟机

    java虚拟机概述和基本概念 堆.栈.方法区 了解虚拟机参数 java虚拟机的原理 所谓的java虚拟机,就是一台虚拟的机器.它是一款软件,用来执行一系列计算指令,大体上虚拟机可以分为系统虚拟机和程序 ...

  • android基础入门教程!一次关于JVM的面试经历,实战篇

    前言 众所周知,Android是一个基于Linux实现的操作系统.但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别. 所以An ...

  • Java虚拟机(JVM)面试题(2020最新版)

    大家好,我是CSDN的博主ThinkWon,"2020博客之星年度总评选'开始啦,希望大家帮我投票,每天都可以投多票哦,点击下方链接,然后点击'最大",再点击'投TA一票'就可以啦 ...

  • Jvm基础,快进来复习复习吧~

    大家好,今天总结了一下老生常谈的 JVM,这也是面试必问的知识. 话不多说,整起来!! 1.JVM 是什么? 1.Java 虚拟机(Jvm)是可运行 Java 代码的假想计算机. 2.Jvm 充当着一 ...

  • JVM真香系列:轻松理解class文件到虚拟机(下)

    回复"000"获取大量电子书 类加载器 类加载器是很多人认为很硬的骨头.其实也没那么可怕,请听老田慢慢道来. 在装载(Load)阶段,通过类的全限定名获取其定义的二进制字节流,需要 ...

  • JVM真香系列:轻松理解class文件到虚拟机(上)

    回复"000"获取大量电子书 JVM初探 class文件到JVM中,就相当于我们吃饭,食物吃进了肚子里,不同的营养成分被身体不同的器官吸收. 查找class文件并导入到JVM中 ( ...