Java架构一窥到底(下)

Java 是如何工作的?

微信搜索关注《Java学研大本营》,加入读者群,分享更多精彩

JVM的各种内存区域

整个加载和运行 Java 程序 JVM 需要内存来存储字节码、对象、变量等多种内容。

总 JVM 内存分为以下 5 个类别:

  1. 方法区

  2. 堆区或堆内存

  3. Java 堆栈区

  4. PC 寄存器区

  5. 原生方法栈区

方法区

方法区将在 JVM 启动时创建。

它将被所有线程共享(全局内存)。

这个内存区域不需要是连续的。

方法区显示运行时常量池。

总类级二进制信息,包括存储在方法区中的静态变量。

方法区

堆区

程序员的观点 堆区域被认为是一个重要的内存区域。

堆区可以被所有线程访问(全局或共享内存)。

堆区域不需要是连续的。

所有的Objects和对应的Instance Variables都会存储在Heap Area中。

Java 中的每个数组都是一个对象,因此数组也将仅存储在堆内存中。

堆内存

栈内存

对于每个线程,JVM 都会创建一个单独的运行时堆栈。

运行时堆栈将在线程创建时自动创建。

所有的方法调用和对应的局部变量,中间结果都将存储在栈中。

对于每个方法调用,一个单独的条目将被添加到堆栈中,该条目称为堆栈框架。完成该方法调用后,堆栈中的相应条目将被删除。

Stack 中存储的数据只能由相应的线程访问,其他线程不可用。

堆叠区

PC寄存器区(程序计数器)

对于每个线程,将在创建线程时创建一个单独的 PC 寄存器。

PC 寄存器包含当前执行指令的地址。

一旦指令执行自动完成,PC 寄存器将递增以保存下一条指令的地址。

本机方法栈

对于每个线程,JVM 都会创建一个单独的本机方法栈。

Thread 调用的所有 Native Method Call 都会存储在对应的 Native Method Stack 中。

笔记:

方法区和堆区是给JVM用的。而堆栈区、PC 寄存器区和本机方法堆栈区是针对线程的。

那就是  每个 JVM 一个单独的堆 

每个 JVM 一个单独的方法区 

每个线程一个单独的堆栈

每个线程一个单独的 PC 寄存器

每个线程一个单独的本机方法堆栈

概括:

静态变量将存储在方法区中。

实例变量将存储在堆区中。

局部变量将存储在Stack Area中。

执行引擎

这是 JVM 的核心组件。

执行引擎负责执行 Java 类文件。

执行引擎包含 2 个用于执行 Java 类的组件。

  1. 口译员

  2. 即时编译器

口译员

它负责读取字节代码并将其解释(转换)为机器代码(本机代码)并逐行执行该机器代码。

口译员的问题在于它每次都口译员,甚至多次使用相同的方法。这降低了系统的性能。

为了克服这个问题,SUN 人在 1.1 版本中引入了JIT 编译器。

即时编译器

JIT 编译器的主要目的是提高性能,这是 java 解释器的缺点。

每当 JVM 遇到任何方法调用时, JIT 编译器在内部为每个方法维护一个单独的计数。

首先,该方法将由解释器正常解释,并且 JIT 编译器递增相应的计数变量。

每个方法都将继续此过程。

一旦任何方法计数达到阈值(新状态的起点)值,JIT 编译器就会识别该方法重复使用的方法。

JIT 编译器立即编译该方法并生成相应的本机代码。下次 JVM 遇到该方法调用时,JVM 直接使用本机代码并执行它,而不是再次解释。从而提高系统的性能。

阈值计数值因JVM 而异。

如果计数第二次达到阈值,一些高级 JIT 编译器将重新编译生成的本机代码,以便生成更优化的机器代码。

执行引擎总结

JVM 至少逐行解释整个程序一次。

JIT 编译仅适用于重复调用的方法。但并非适用于所有方法。

推荐书单

《项目驱动零起点学Java》

《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。

《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。

马士兵,马士兵教育创始人,毕业于清华大学,著名IT讲师,所讲课程广受欢迎,学生遍布全球大厂,擅长用简单的语言讲授复杂的问题,擅长项目驱动知识的综合学习。马士兵教育获得在线教育“名课堂”奖、“最受欢迎机构”奖。

赵珊珊,从事多年一线开发,曾为国税、地税税务系统工作。拥有7年一线教学经验,多年线上、线下教育的积累沉淀,培养学员数万名,讲解细致,脉络清晰。

《项目驱动零起点学Java》(马士兵,赵珊珊)【摘要 书评 试读】- 京东图书京东JD.COM图书频道为您提供《项目驱动零起点学Java》在线选购,本书作者:,出版社:清华大学出版社。买图书,到京东。网购图书,享受最低优惠折扣!icon-default.png?t=N3I4https://item.jd.com/13607758.html

 

精彩回顾

部署Spring Boot应用程序

Java Spring Boot 3.0.0 RC1 震撼登场!

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值