JAVA虚拟机JVM工作原理

article/2025/8/19 23:06:04

提起JAVA,都知道它有个虚拟机,因此可以跨平台,一次编写,到处运行。但具体原理是咋样的?身为JAVA小白,岂可不知!

一、原理
二、结构
1、类加载器
2、执行引擎
3、运行时数据区域

一、原理
JVM实现了JAVA语言最重要的特征:平台无关性。其原理:java程序并不直接在操作系统上执行,而是由JVM执行。JVM屏蔽了与具体平台相关的信息,使得JAVA程序只需编译成适应JVM,可以在JVM上运行的目标代码(.class)就行,JVM再负责解释成具体平台的机器指令执行。同时,JVM还会进行安全检查,是java程序的安全检验引擎。

二、结构
JVM由三大部分组成:

1、类加载器
2、执行引擎
3、运行时数据区域

在这里插入图片描述
也有说法是包括本地库接口的。
在这里插入图片描述
首先通过编译器把 Java源代码转换成字节码,Class loader(类装载)再把字节码加载到内存
中,将其放在运行时数据区的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直
接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将
字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库
接口(Native Interface)来实现整个程序的功能。

1、类加载器
具体作用就是将.class文件加载到jvm虚拟机中去,程序就可以正确运行了。但是,jvm启动的时候,并不会一次性加载所有的.class文件,而是根据需要去动态加载。

类的加载过程采用双亲委派模型:

1)当前类加载器首先检查自己的加载清单,如果存在该类,则返回之;2)如果没找到,委托父类加载器去加载;父类加载器重复动作1,递归至祖宗bootstrap ClassLoder(我靠,bootstrap,还以为是前端框架呢。bootstrap,引导之意);3)都没有,仍然由当前类加载器加载,并纳入自己缓存中。

采用双亲委派模型,目的在于更好的保证Java平台的安全。所谓的安全,是指java的核心类不被用户自己编写的类所替换。由于核心类在虚拟机初始化时就已加载,而每次加载类前先检查是否存在,所以可以避免核心类被替换。

各种类加载器:
在这里插入图片描述
Bootstrap class loader: 启动类加载器(或曰父类加载器)
当运行 java 虚拟机时,这个类加载器被创建,它负责加载虚拟机的核心类库,如 java.lang.* 等。例如 java.lang.Object 就是由根类加载器加载的。需要注意的是,这个类加载器不是用 java 语言写的,而是用 C/C++ 写的。

这个类加载器负责将存放在<JAVA_HOME>lib目录中的,或者被-Xbootclasspath参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如rt.jar,名字不符合的类库即使放在lib目录中也不会被加载)类库加载到虚拟机内存中。

Extension class loader:扩展类加载器
这个加载器加载出了基本 API 之外的一些拓展类。

这个加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载<JAVA_HOME>libext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库,开发者可以直接使用扩展类加载器。

AppClass Loader(SystemAppClass):
加载应用程序和程序员自定义的类。

2、执行引擎
作用: 执行java编译好的字节码,或者执行本地方法

3、运行时数据区域
JVM 运行时数据区域 (JVM Runtime Area) 其实就是指 JVM 在运行期间,其对JVM内存空间的划分和分配。JVM在运行时将数据划分为6个区域来存储:

Program Counter (PC) Register:程序计数器Java Virtual Machine Stacks:Java虚拟机栈Heap Memory:堆内存Method Area:方法区Run-time Constant Pool:运行时常量池Native Method Stacks:本地方法栈

在这里插入图片描述

我们写的所有程序都被加载到这里,按不同类别存放在

堆内存
Java虚拟机栈
本地方法栈
程序计数器
方法区

1)从线程的角度理解Java Runtime Area

a.线程私有:
程序计数器 Java虚拟机栈 本地方法栈,生命周期与线程一致;

这3个内存区域是不需要进行垃圾回收的。因为他们的生命周期是和线程同步的,随着线程的销毁,他们占用的内存会自动释放。

b.线程共享:
堆内存,方法区,运行时常量池,生命周期与JVM一致。

方法区堆内存需要进行垃圾回收,回收的对象就是那些不存在任何引用的对象。

2)从存储内容理解Java Runtime Area

方法区常量池存储类的信息

堆内存存储对象信息

程序计数器Java虚拟机栈本地方法栈存储线程的信息

3)堆内存、方法区和运行时常量
方法区的作用是存储 Java 类的结构信息,当我们创建对象实例后,对象的类型信息存储在方法区之中,实例数据存放在堆内存中;

运行时常量池是方法区的一部分,所以也是全局共享的。其作用是存储 Java 类文件常量池中的符号信息。

运行时常量池就是将编译后的类信息放入方法区中,也就是说它是方法区的一部分。 运行时常量池用来动态获取类信息,包括:class文件元信息描述、编译后的代码数据、引用类型数据、类文件常量池等。 运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中。

4)直接内存(Direct Memory)
直接内存并不是JVM管理的内存,而是JVM以外的机器内存。比如,你有4G的内存,JVM占用了1G,则其余的3G就是直接内存。

JDK中有一种基于通道(Channel)和缓冲区(Buffer)的内存分配方式,将由C语言实现的native函数库分配在直接内存中,用存储在JVM堆中的DirectByteBuffer来引用。由于直接内存收到本机器内存的限制,所以也可能出现OutOfMemoryError的异常。


http://chatgpt.dhexx.cn/article/1uCSPfWN.shtml

相关文章

JVM 运行机制及其原理

最近出去面试&#xff0c;总被问到Java JVM相关的东西&#xff0c;什么JVM的内存模型、JVM的内存分配、内存回收、内存回收算法…搞得我一头雾水&#xff0c;早些年还看过一些&#xff0c;蹭着有时间给大家也给自己总结下JVM相关的知识。 JVM JVM是Java Virtual Machine&…

JVM原理-超详细总结

JVM概念 JVM是java的核心和基础在java编译器和os平台之间的虚拟处理器。它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台&#xff0c;可以在上面执行java的字节码程序。java编译器只要面向JVM&#xff0c;生成JVM能理解的代码或字节码文件。Java源文件经…

2022年iOS最新面试(底层基础)问题答案

文章目录 Runloop 1、RunLoop 的本质是什么&#xff1f;2、Runloop和线程是什么关系&#xff1f;3、Runloop的底层数据结构是什么样的&#xff1f;有几种 运行模式&#xff08;mode&#xff09;&#xff1f;每个运行模式下面的 CFRunloopMode 是哪些&#xff1f;他们分别是什么…

2019年面试必备:iOS 面试题大全(附答案)

这个栏目将持续更新–请iOS的小伙伴关注! 1、多线程的应用 2、GCD实现多个请求都完成之后返回结果 3、A、B两个int数组&#xff0c;得到A数组中B数组不包含的元素 4、事件传递链&#xff0c;页面上一个按钮&#xff0c;按钮和它的superView有一样的action,为什么只执行button的…

iOS 多线程面试题

没有比这里更全的了&#xff0c;看我就好了 面试官&#x1f603; &#xff1a;你了解进程吗&#xff1f;谈谈你对进程和线程的理解&#xff1f; 不谈进程&#xff0c;线程无从谈起。要了解什么是线程&#xff0c;我们先需要理解什么是线程。 秒懂百科 &#x1f603; 以上百科&…

2020,300道高级iOS开发面试题(最新整理)

这个栏目将持续更新–请iOS的小伙伴关注! 一&#xff1a;知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新i…

iOS经典面试题大全

1.INTERVIEW 共勉 作为一个开发者&#xff0c;有一个学习的氛围跟一个交流圈子特别重要&#xff0c;这是一个我的iOS交流群&#xff1a;638302184&#xff0c;不管你是小白还是大牛欢迎入驻 &#xff0c;分享BAT,阿里面试题、面试经验&#xff0c;讨论技术&#xff0c; 与2800i…

2021年,整理的iOS高频面试题及答案(总会有你需要的)

推荐阅读&#xff1a;关于iOS面试题汇总(栏目持续更新) 各位最近应该忙于跳槽与面试吧&#xff0c;毕竟金三银四&#xff0c;珍惜好机会&#xff0c;预祝大家面试顺利通过&#xff0c;迎接大厂offer。有需要资料可以私聊我了解 从输入url到页面展示到底发生了什么 1、输入地…

iOS面试题 2016版

2015-1-3 达内纪老师 GitHub&#xff0c;CSDN博客 说明&#xff1a; 最近为达内学员整理面试题。发现网上的面试题和答案基本都是抄来抄去的&#xff0c;甚至很多答案都是错误的。 所以整理了常见的面试题&#xff0c;对答案重新进行了筛选整理。 如果答案有错漏或者更好的答案…

iOS面试题系列之常见算法

iOS面试中熟悉常见算法 1、 对以下一组数据进行降序排序&#xff08;冒泡排序&#xff09;。“24&#xff0c;17&#xff0c;85&#xff0c;13&#xff0c;9&#xff0c;54&#xff0c;76&#xff0c;45&#xff0c;5&#xff0c;63” int main(int argc, char *argv[]) {int …

(2021年)iOS面试题及答案,以及添加Flutter 面试问题,Swift面试题

面试题的深入解析&#xff1b;​​​​​​​ 一&#xff0c;内存管理在实际开发中的应运。 1.UITableView的数据条数太多时会消耗内存&#xff0c;可以给UITableViewCell、UICollectionViewCell、UITableViewHeaderFooterView设置正确的复用ID&#xff0c;充分复用。 2.有…

iOS中高级面试题

https://blog.csdn.net/u014600626/article/details/102923706 iOS基础 1&#xff1a;讲讲你对atomic & nonatomic的理解 1、原子操作对线程安全并无任何安全保证。被 atomic 修饰的属性(不重载设置器和访问器)只保证了对数据读写的完整性&#xff0c;也就是原子性&am…

ios 面试题

1 为什么block要用copy修饰&#xff1f; 答&#xff1a;因为block在创建的时候&#xff0c;它的内存是分配在栈上的&#xff0c;而不是在堆区。栈区的特点是&#xff1a;对象随时有可能被销毁&#xff0c;一旦被销毁&#xff0c;在调用时就会造成崩溃。所以我们要使用copy吧它拷…

2022年 iOS面试题总结

前言 都说今年互联网行情很差&#xff0c;iOS行情更差。但到底怎么样呢&#xff0c;不能光听别人说&#xff0c;而要自己走出去看一看。我的面试的阶段基本都在3月份&#xff0c;准备的阶段则要再往前推个半个月吧。期间约到了不少一二线互联网公司面试机会&#xff0c;前期由…

iOS面试题(七)

iOS面试题&#xff08;一&#xff09; iOS面试题&#xff08;二&#xff09; iOS面试题&#xff08;三&#xff09; iOS面试题&#xff08;四&#xff09; iOS面试题&#xff08;五&#xff09; iOS面试题&#xff08;六&#xff09; iOS面试题&#xff08;七&#xff09; iOS面…

iOS基础面试题(一)

kaikaijia同学私信我,说想加群,我就建个iOS开发群,大家做技术交流和资源,群号:241048287(已满),群号2 :340957379(已满) 群号3:370041534 (已满) 有兴趣的同学可以加群,验证信息:iOS+姓名。 所有的群都已到人数上限,本着“与时俱进”精神,建了个"iOS面试&…

ios面试题总结

本篇主要针对面试题进行解析&#xff0c;会进行基础知识的总结和拓展&#xff0c;仅供参考&#xff0c;如有错误&#xff0c;欢迎指出&#xff0c;一起学习&#xff01; 一、关于Foundation框架中的问题 &#xff08;一&#xff09;NSCache & NSDictionary 1.NSDictiona…

iOS面试题大全2021(附答案)

1、简述你项目中常用的设计模式。它们有什么优缺点&#xff1f; 常用的设计模式有&#xff1a;代理、观察者、单例。 &#xff08;1&#xff09;单例&#xff1a;它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例…

iOS 中高级面试题(附答案)

RunLoop 1、什么是 RunLoop? RunLoop 作用有哪些&#xff1f; RunLoop 可以称之为运行循环&#xff0c;在程序运行过程中循环做一些事情&#xff0c;如果没有 RunLoop 程序执行完毕就会立即退出&#xff0c;有 RunLoop 程序会一直运行&#xff0c;并且时时刻刻在等待用户的输…

安装MyBatis教程

简单安装MyBatis教程 1. 介绍 MyBatis简介 1&#xff09; MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架 2&#xff09; MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3&#xff09; MyBatis可以使用简单的XML或注解用于配置和原…