更新时间:2020-10-22 17:18:15 来源:极悦 浏览1163次
我们知道java语言的特点之一是跨平台性,而JVM是java跨平台的关键所在。JVM上执行java字节码,执行时这些字节码可以解释成具体平台的机器码,学习JVM运行机制以及原理,会懂得为什么java语言拥有“一次编译,处处运行”这一跨平台能力。
什么是JVM呢?JVM是Java Virtual Machine(Java虚拟机)的缩写,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机主要由字节码指令集、寄存器、栈、垃圾回收堆和存储方法域等构成。JVM屏蔽了与具体操作系统平台相关的信息,使java程序只需生成在java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
要知道JVM运行机制,对JVM内存模型的构成要了解,我们从内存模型来理解JVM运行机制。JVM内存模型主要由堆内存、方法区、程序计数器、虚拟机栈和本地方法栈组成,其组成的结构如下图所示:
堆内存:堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。堆内存是我们在生产环境中进行内存性能调优中的一个重要的内容,而内存回收的一些机制和算法也是在java面试题中常出现的考察内容。
方法区:方法区与java堆一样,是各个线程共享的区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译(JIT)后的代码等数据。由于程序中所有的线程共享一个方法区,所以访问方法区的信息必须确保线程是安全的。如果有两个线程同时去加载一个类,那么只能有一个线程被允许去加载这个类,另一个必须等待。在程序运行时,方法区的大小是可以改变的,程序在运行时可以扩展。同时,方法区里面的对象也可以被垃圾回收,但条件非常严苛,必须在该类没有任何引用的情况下才能被GC回收。
程序计数器:JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,为了各条线程之间的切换后计数器能恢复到正确的执行位置,所以每条线程都会有一个独立的程序计数器。当线程正在执行一个Java方法,程序计数器记录的是正在执行的JVM字节码指令的地址;如果正在执行的是一个Natvie(本地方法),那么这个计数器的值则为空。程序计数器占用的内存空间很少,也是唯一一个在JVM规范中没有规定任何内存不足错误的区域。
Java虚拟机栈:与程序计数器一样,Java虚拟机栈也是线程私有的,用通俗的话将它就是我们常常听说到堆栈中的那个“栈内存”。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表(局部变量表需要的内存在编译期间就确定了所以在方法运行期间不会改变大小),操作数栈,动态链接,方法出口等信息。每一个方法从调用至出栈的过程,就对应着栈帧在虚拟机中从入栈到出栈的过程。
本地方法栈:栈作为一种线性的管道结构,遵循先进后出的原则。主要用于存储本地方法的局部变量表,本地方法的操作数栈等信息。当栈内的数据在超出其作用域后,会被自动释放掉。本地方法栈是在程序调用或JVM调用本地方法接口(Native)时候启用。
JVM的生命周期,JVM在Java程序开始执行的时候,它才运行,程序结束的时它就停止。一个Java程序会开启一个JVM进程,如果一台机器上运行三个程序,那么就会有三个运行中的JVM进程。JVM中的线程分为两种:守护线程和普通线程,守护线程是JVM自己使用的线程,比如垃圾回收(GC)就是一个守护线程;普通线程一般是Java程序的线程,只要JVM中有普通线程在执行,那么JVM就不会停止。
以上是对JVM运行机制的解释介绍,希望大家可以认真学习,JVM虚拟机是构成java编程技术体系的重要一部分,对JVM运行机制原理理解好了后,才可以在java教程中更好的学习到虚拟机更多更深入的知识点。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习