「JVM」知识点详解一:JVM运行原理详解

本文详细介绍了JVM的运行原理,包括其作为Java虚拟机的组成部分,如字节码指令集、寄存器、栈、垃圾回收堆和方法域等。解释了JVM如何实现跨平台的“一次编译,到处运行”。同时,文章讨论了JVM的基本概念,如类加载器、本地接口、执行引擎和运行数据区,并详细阐述了每个部分的功能。堆和方法区的调优也是JVM优化的重点,特别是对堆内存的管理和垃圾回收的理解。通过了解这些基础知识,有助于更好地理解和优化Java程序的性能。
摘要由CSDN通过智能技术生成

前言

JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易。JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理。

正文

1 什么是JVM?

JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运行,这也是Java能够**“一次编译,到处运行的”**原因。

2.JVM基本概念

(1) 基本概念:

JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。

(2) 运行过程:

我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码 。

也就是如下:

① Java源文件—->编译器—->字节码文件

② 字节码文件—->JVM—->机器码

每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是Java为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

(3) 三种JVM:

① Sun公司的HotSpot;

② BEA公司的JRockit;

③ IBM公司的J9 JVM;

在JDK1.7及其以前我们所使用的都是Sun公司的HotSpot,但由于Sun公司和BEA公司都被oracle收购,jdk1.8将采用Sun公司的HotSpot和BEA公司的JRockit两个JVM中精华形成jdk1.8的JVM。

3.JVM的体系结构

「JVM」知识点详解一:JVM运行原理详解

(1) Class Loader类加载器

负责加载 .class文件,class文件在文件开头有特定的文件标示,并且ClassLoader负责class文件的加载等,至于它是否可以运行,则由Execution Engine决定。

① 定位和导入二进制class文件

② 验证导入类的正确性

③ 为类分配初始化内存

④ 帮助解析符号引用.

(2) Native Interface本地接口:

本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序,Java诞生的时候C/C++横行的时候,要想立足,必须有调用C/C++程序,于是就在内存中专门开辟了一块区域处理标记为native的代码,它的具体作法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机,或者Java系统管理生产设备,在企业级应用中已经比较少见。

因为现在的异构领域间的通信很发达,比如可以使用Socket通信,也可以使用Web Service等。

(3) Execution Engine 执行引擎:执行包在装载类的方法中的指令,也就是方法。

(4) Runtime data area 运行数据区:

虚拟机内存或者Jvm内存,冲整个计算机内存中开辟一块内存存储Jvm需要用到的对象,变量等,运行区数据有分很多小区,分别为:方法区,虚拟机栈,本地方法栈,堆,程序计数器。

4.JVM数据运行区详解(栈管运行,堆管存储):

说明:JVM调优主要就是优化 Heap堆 和 Method Area 方法区。

「JVM」知识点详解一:JVM运行原理详解

(1) Native Method Stack本地方法栈

它的具体做法是Native Method Stack中登记native方法,在Execution Engine执行时加载native libraies。

(2) PC Register程序计数器

每个线程都有一个程序计算器,就是一个指针,指向方法区中的方法字节码(下一个将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不记。

(3) Method Area方法区

方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间。

静态变量+常量+类信息+运行时常量池存在方法区中,实例变量存在堆内存中。

(4) Stack 栈

① 栈是什么

栈也叫栈内存,主管Java程序的运行,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就Over,生命周期和线程一致,是线程私有的。

基本类型的变量和对象的引用变量都是在函数的栈内存中分配。

② 栈存储什么?

栈帧中主要保存3类数据:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值