Java虚拟机必学之四大知识要点

MacTeX+TeXstudio:Macbook配置本地Latex看这一篇就够了 这个博客记录本人在MacBook上配置本地Latex的流程,其中选择的编译环境为MacTeX,编辑器为TeXstudio。采用的原因主要两点:一个是本人配置的原因主要是用来撰写毕业论文,希望能够尽可能简化设置流程,专注内容表达;第二是由于本人还有一个windows系统的笔记本,想要编辑器在专注写作体验的同时在两个系统上能够都适配,从而减少切换效率,故选择此组合。这篇文章介绍并详细记录了本人的安装流程,有相同需求的同志也可借鉴。 阅读详情

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常时,不会束手无策,不会一脸懵逼地上网找解决办法,最后就算改了几个启动参数解决了问题,也还是云里雾里。

这次,我会从我专栏里提取了学习 Java 虚拟机的 X 大知识要点,助力大家深入理解 JVM,知其然也知其所以然。 不过你在看知识点之前,最好能问问自己你会怎么回答,再和我提供的内容做对比,这样子提升会比较明显。

第一大知识要点:Java 字节码是如何在虚拟机里运行的?

我将以 HotSpot 虚拟机为例,从虚拟机以及底层硬件两个角度,来分享解析。

一、从虚拟机视角来看

执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区中。实际运行时,虚拟机会执行方法区内的代码。

如果你熟悉 X86 的话,你会发现这和段式内存管理中的代码段类似。而且,Java 虚拟机同样也在内存中划分出堆和栈来存储运行时数据。不同的是,Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向用 C++ 写的 native 方法的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

在运行过程中,每当调用进入一个 Java 方法,Java 虚拟机会在当前线程的 Java 方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且 Java 虚拟机不要求栈帧在内存空间里连续分布。

当退出当前执行的方法时,不管是正常返回还是异常返回,Java 虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。

二、从硬件视角来看

Java 字节码无法直接执行。因此,Java 虚拟机需要将字节码翻译成机器码。

在 HotSpot 里面,上述翻译过程有两种形式:第一种是解释执行,相当于同声传译,即每解析一条字节码,便翻译成机器码并执行;第二种是即时编译(Just-In-Time compilation,JIT),则相当于线下翻译,即将整个方法中所包含的字节码统一翻译成机器码后在执行。

前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

第二大知识要点:Java 虚拟机是如何加载 Java 类的?

Java 虚拟机加载 Java 类的过程可分为加载、链接以及初始化三大步骤。

加载是指查找字节流,并且据此创建类的过程。加载需要借助类加载器,在 Java 虚拟机中,类加载器使用了双亲委派模型,即接收到加载请求时,会先将请求转发给父类加载器。

链接,是指将创建成的类合并至 Java 虚拟机中,使之能够执行的过程。链接还分验证、准备和解析三个阶段,分别完成“验证被加载类是否满足 Java 虚拟机约束”,“为被加载类静态字段分配内存”,以及“将被加载类中的符号引用解析成为实际引用”的工作。其中,Java 虚拟机规范并不要求解析阶段一定要在链接步骤中完成。

初始化,则是为标记为常量值的字段赋值,以及执行 方法的过程。类的初始化仅会被执行一次,这个特性被用来实现单例的延迟初始化。

第三大知识要点:Java 虚拟机是如何进行垃圾回收的?

Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象。它从一系列 GC Roots 出发,边标记边探索所有被引用的对象。为了防止在标记过程中堆栈的状态发生改变,Java 虚拟机采取安全点机制来实现 Stop-The-World 操作,暂停其他非垃圾回收线程。

回收垃圾对象的内存共有三种基础算法,分别为:会造成内存碎片的清除算法、性能开销较大的压缩算法、以及堆使用效率较低的复制算法。

通常来说,Java 虚拟机会采用分代回收的思想,将堆划分为新生代和老年代,并且通过在不同代中应用不同的垃圾回收算法。

传统的做法是将新生代再划分为 Eden 区和两个大小一致的 Survivor 区。在只针对新生代的 Minor GC 中,Eden 区和非空 Survivor 区的存活对象会被复制到空的 Survivor 区中,当 Survivor 区中的存活对象复制次数超过一定数值时,它将被晋升至老年代。

因为 Minor GC 只针对新生代进行垃圾回收,所以在枚举 GC Roots 的时候,它需要考虑从老年代到新生代的引用。为了避免扫描整个老年代,Java 虚拟机引入了名为卡表的技术,大致地标出可能存在老年代到新生代的引用的内存区域。

G1 垃圾回收器将堆划分为多个等大的区域,每个区域都可以充当 Eden 区,Survivor 区或者老年代区。G1 会优先收集垃圾最多的区域,从而最大化垃圾回收的效益。这也是 Garbage First 名字的由来。

Java 11 中引入的实验性垃圾回收器 ZGC,仅在扫描 GC Roots 时请求 Stop-The-World,暂停应用线程。因此,它宣称可将 GC 暂停时间控制在 10ms 以下。ZGC 暂时没有应用分代回收的思路,将整个堆空间看成一块,其代价是垃圾回收 CPU 消耗较高。

第四大知识要点:Java 内存模型是什么?

在现代计算机系统中,代码通常不会按照书写顺序执行。造成这一情况的原因有三个,分别为编译器的重排序,处理器的乱序执行,以及内存系统的重排序。

以内存系统重排序为例,在多处理器体系架构下,每个处理器都可能缓存了一部分数据。由于时刻保持缓存数据与内存数据同步的性能代价太大,因此部分体系架构可能允许缓存数据与内存数据不同步。这对 Java 程序的影响便是,两个不同的 Java 线程在同一时间内看到的同一块内存地址中的值可能不同。

Java 内存模型是针对上述问题而提出的一套规范,用以允许 Java 程序员更为细致地定义 Java 程序的内存行为。它通过定义了一系列的 happens-before 操作,让应用程序开发者能够轻易地表达不同线程的操作之间的内存可见性。

在遵守 Java 内存模型的前提下,即时编译器以及底层体系架构能够调整内存访问操作,以达到性能优化的效果。如果开发者没有正确地利用 happens-before 规则,那么将可能导致数据竞争。

Java 内存模型是通过内存屏障来禁止重排序的。对于即时编译器来说,内存屏障将限制它所能做的重排序优化。对于处理器来说,内存屏障会导致缓存的刷新操作。

Logisim实战:手把手教你搭建GB2312汉字字库(附完整电路图) 本文提供了一份详尽的Logisim实战指南,手把手教你如何利用存储芯片,通过位扩展和字扩展技术,构建一个完整的GB2312汉字字库。文章深入浅出地讲解了从编码原理、系统架构设计到具体电路实现与调试的全过程,是学习计算机组成原理和数字电路设计的绝佳实践项目。 阅读详情

相关推荐

QT 面试题汇总

一、讲述Qt信号槽机制与优势与不足 优点:①类型安全。需要关联的信号槽的签名必须是等同的。即信号的参数类型和参数个数同接受该信号的槽的参数类型和参数个数相同。若信号和槽签名不一致,编译器会报错。 ②松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无需知道是那个对象的那个信号槽接收它发出的信号,它只需在适当的时间发送适当的信号即可,而不需要关心是否被接受和那个对象接受了。Qt就保证了适当的槽得到了调用,即使关联的对象在运行时被删除。程序也不会奔溃。 ...

编程菜鸟 4万+

程序员转行方向推荐

对于程序员转行方向的推荐,可以基于当前的技术趋势、市场需求以及程序员的个人技能和兴趣来综合考虑。以下是一些推荐的转行方向:伴随着社会的发展,网络安全被列为国家安全战略的一部分,因此越来越多的行业开始迫切需要网安人员,也有不少人转行学习网络安全。

韩束一叶子 1339

逆变器专题(9)-基于dq坐标系的逆变器解耦控制建模与实时仿真分析

本文深入探讨了基于dq坐标系的逆变器解耦控制建模与实时仿真分析。通过生动的比喻和详细的数学推导,阐述了如何通过坐标变换和前馈补偿实现d轴与q轴的独立控制,从而提升系统动态性能与稳定性。文章还介绍了在MATLAB/Simulink中搭建仿真模型、分析动态响应与稳定性的方法,并展望了硬件在环(HIL)实时仿真的高级验证手段,为新能源并网与电机驱动领域的工程师提供了宝贵的实践指南。

gold的博客 547

30岁一无所长,转行做什么?我为什么会选择python?

以现在的年龄+10,你想过什么样的生活?+5、+3等都可以,只是为了明晰你的长期生活目标。接着把若干年后对生活的想法,参照下表折算成具体的金钱。上表数字仅为举例那什么样的工作,才能承载你的生活目标呢?不了解其他行业也很简单,智联、大街网等招聘门户上查下薪资即可。30岁转行,更加需要考虑未来行业对生活的帮助有哪些。像线人。可是我上哪里去发展线人?在打了1个月电话收效甚微,为了增加我账号在系统客源分配的权重,我又开始打虚假带看,是可是又被系统识别出2次,招致严厉的处罚。

喜欢Python编程的程序员柚柚呀 652

Vivado与Vscode无缝集成:高效Verilog开发环境搭建指南

本文详细介绍了如何将Vivado与Vscode无缝集成,打造高效的Verilog开发环境。通过替换Vivado默认编辑器为Vscode,配置必备插件和语法检查工具,开发者可以大幅提升FPGA项目的编码效率。文章还提供了代码片段、Testbench自动生成等高级技巧,帮助开发者快速上手这一集成方案。

weixin_33737774的博客 493

爱快路由(ikuai)多WAN口配置实战:提升网络带宽与稳定性

本文详细解析了爱快路由(ikuai)多WAN口配置的实战技巧,包括双线智能分流、毫秒级故障切换和带宽叠加利用等核心功能。通过七种配置方案和智能QoS策略,帮助企业提升网络带宽与稳定性,实现99.9%以上的高可用性。

weixin_30566063的博客 701

2024年程序员都转行,我该何去何从呢!

疫情后大环境下行,各行各业的就业情况都是一言难尽。互联网行业更是极不稳定,频频爆出裁员的消息。大家都说2024年程序员的就业很难,都很焦虑,在许多人眼里,程序员可能是一群背着电脑、 进入大上写字楼的职业,他们虽然经历着”脱发"的苦恼,但却有高薪的回报。而实际上,只有真正身处其中,才深知这背后隐藏的巨大压力。一方面,降本增效、AI爆火 ,导致岗位变少;另-面,互联网的飞速发展又在不断地吸引年轻的竞争者进入市场。如果技术水平不咋样,到了30来岁 ,还要面临上坏去、下不来的尴尬困境。总之就是:我太难了…

2401_84578953的博客 1765

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之OS模块配置详解(中)

weixin_42412049的博客 1515

程序员必看!2025年十大高薪转型方向收藏指南(含大模型应用领域)

文章为程序员提供了2025年十大高薪转型方向,包括数据科学、产品管理、技术咨询、网络安全等,每个方向详述了转型优势、核心技能、发展前景等关键信息。同时指出转型成功需注重技能迁移、知识补充、人脉建设和渐进过渡。无论选择哪个方向,程序员的结构化思维和持续学习能力都是最宝贵资产,建议结合个人兴趣与市场趋势选择最适合的转型路径。

kaka0722ww的博客 1500

13《CAN总线五种错误类型,故障判定全解析》

CAN总线规定,发送节点在发送完EOF字段后,会留出一个ACK Slot(应答槽)。这个槽里,发送节点自己会输出隐性电平(逻辑1),然后“期待”至少有一个其他节点在这个槽里把它拉成显性电平(逻辑0)。如果这个槽结束时仍然是隐性电平,发送节点就判定:刚才那帧报文,没有任何一个节点成功接收——这就是应答错误。简单说,就是“我喊了一嗓子,却没人应声”。

2401_88858637的博客 264

如何在 SAPGUI 里显示上传到 ABAP 服务器的 PDF 文件

在 SAPGUI 里显示 PDF 文件是实际项目中一个很有用的需求。因为在 SAP 实际业务场景中,有大量的流程会生成 PDF 格式的数据。把这种类型的数据输出显示在 SAPGUI 里,方便最终用户查看。本教程后续步骤,还会向大家介绍如何使用 ABAP 代码生成 PDF 格式的数据。本步骤只是简单的将本地 PDF 文件,上传到 ABAP 系统并显示在 SAPGUI 里。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2687

程序员都是怎么转行的,可以给一些建议吗?

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

Python_0011的博客 2297

嵌入式面试题精选100道及参考答案(4万字长文)

指针是C语言中一种特殊的变量,它存储的是另一个变量的内存地址。指针的使用提供了一种间接访问和操作内存的方法。地址操作:通过使用运算符,可以获取变量的地址,并将这个地址赋值给指针变量。间接引用:使用运算符可以访问指针指向的变量的值。动态内存分配:指针用于动态地分配和释放内存。数组操作:指针可以用于遍历和操作数组。函数参数:指针作为函数参数可以改变原始数据。字符串操作:在C语言中,字符串通常以字符数组的形式存在,并通过字符指针进行操作。// 指向数组的第一个元素i < 5;++i) {在这个例子中,

大模型大数据攻城狮的专栏 1971

Java虚拟机必学之四大知识要点你掌握了吗?

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常时,不会束手无策,不会一脸懵逼地上网找解决办法,最后就算改了几个启动参数解决...

测试0901-1 125

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

与java的优势 控制硬件_Java虚拟机必学之四大知识点

作为一位 Java 程序员,在尽情享受 Java 虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉 JVM,你才能在遇到 OutOfMemory 等异常时,不会束手无策,不会一脸懵逼地上网找解决办法,最后就算改了几个启动参数解决了问题,也还是云里雾里。第一大知识要点:Java 字节码是如何在虚拟机里运行的?我将以 HotSpot 虚...

weixin_35757191的博客 104

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java虚拟机必学之四大知识要点,附系列学习资料!

作者:郑雨迪来源:极客时间《深入拆解Java虚拟机》作为一位Java程序员,在尽情享受Java虚拟机带来好处的同时,我们还应该去了解和思考“这些技术特性是如何实现的”,去了解最底层的原理。只有熟悉JVM,你才能在遇到 OutOfMemory等异常时,不会束手无策,不会一脸懵逼地上网找解决办法,最后就算改了几个启动参数解决了问题,也还是云里雾里。这次,我会从我专栏里提取了学习Java虚拟机的X大知识...

weixin_33904756的博客 197

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

三大java虚拟机_java虚拟机四大知识点

第一知识点,java字节码是如何在虚拟机里运行的(以下都已hotSpot虚拟机为例)1.虚拟机视角看执行 java代码首先需要将它编译成class文件加载到java虚拟机中,加载后的java类会被存放在方法区中,实际运行时,虚拟机会执行方法区内的代码。如果你熟悉X86,你会发现这个段式内存管理中的代码段类似,而且,java虚拟机同样也在内存汇总划分出堆和栈来存储运行时的数据,不同的是,java虚拟...

weixin_39863631的博客 202

学习Java编程知识 必知要点

学习Java编程知识最强路线

m0_69234258的博客 603

一文了解Java虚拟机必备知识要点

对于 Java 程序员来讲,Spring 全家桶是精妙的招式,JVM 就是内功心法很重要的一块,线上出现性能问题,JVM 调优更是不可回避的问题,因此 JVM 基础知识对于高级程序员的重要性不必言语。我司在面试高级开发的时候,JVM 相关知识也必定是考核的标准之一,下面的知识要点你都学了吗?(点击,可查看图片细节)这张图是由极客时间专栏作者郑雨迪,结合他新专栏《深入拆解 Java 虚拟机》所做,手...

weixin_34319999的博客 181

Java虚拟机知识点总结

文章目录Java虚拟机知识点总结Java的平台无关性即一次编译处处执行如何实现为什么JVM不直接将源码解析成机器码去执行JVM如何加载.class文件 Java虚拟机知识点总结 Java的平台无关性即一次编译处处执行如何实现 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同平台上运行时不需要进行重新编译,Java虚拟机在执行字节码的时候,把字节码转换成具体平台上的...

qq_24095055的博客 3031

Java虚拟机知识汇总

先来看一下Java运行时的数据区域,Java虚拟机在执行Java程序的过程中,会把它所管理的内存,划分成若干个不同的数据区域,这些区域都有各自的用途,各自的创建和销毁的时间。 有的区域,随着虚拟机进程的启动而存在;有些区域,则依赖用户线程的启动和结束而建立和销毁。 我们来看一下Java虚拟机运行时的数据区。 1、程序计数器 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的...

myroncham的博客 342

Java开发必学知识点总结,让你从小白到大咖

很多零基础想学Java开发的小伙伴都在找学习资料,网上虽然也很多,但是内容比较单一,不成体系,今天,汇智妹就来总结一下关于零基础学习Java开发的必学知识点。学习是一个循序渐进的过程,下面汇智妹分四个阶段来说: 第一阶段:小白入门 1、基础语法 对于零基础小白来说,学习Java的基础语法,能熟练掌握Java 语言的语法规则,需要掌握的技术要点有:Hello World、常量、变量、...

成都汇智动力的博客 581

深入理解Java虚拟机的重点知识

欢迎访问:https://andyofjuly.github.io/ 博文主要介绍了java虚拟机的相关知识,主要包括:java内存区域、垃圾回收、类加载机制等相关知识。 博文主要参考了周志明的深入理解 Java 虚拟机第二版书籍,这也是目前许多博客上引用得最多的关于Jvm的书籍。另外也引用了github和优快云上的博客,在此表示感谢! 博文主要用于学习参考。 目录 一、运行时数据区域 ...

fallwind_of_july的博客 1351

Java虚拟机与垃圾回收知识点梳理(二)

垃圾收集算法和垃圾收集器如何判断一个对象是不是垃圾引用计数法可达性分析算法哪些对象可以作为GC RootsJava中的对象引用分类垃圾收集算法标记-清除算法标记-复制算法(复制算法)标记-整理算法垃圾收集器(Hotspot虚拟机)Serial收集器ParNew收集器CMS收集器Serial Old收集器ParNew Old收集器G1收集器 如何判断一个对象是不是垃圾 引用计数法 原理:在对象中添加...

yemuxiaweiliang的博客 1067

java基础教程,初级Java四大核心基础知识

初级Java四大核心基础知识,Java描述复杂数据结构的主要方式是集合框架。Java没有指针,而是通过强大的集合框架描述数组、对象数组等复杂的数据结构。对于初学者而言应该有坚实的Java开发基础。初级Java四大核心基础知识如下: 一、先了解什么是Java的四个方面 初学者先弄清这些Java的基本概念也是必不可少的,死记硬背肯定是不行的,重在理解,理解它们之间的区别与联系,分别有哪些应用。想想...

qq_27513477的博客 434

终于有人把Java程序员必学知识点整理出来了,令人茅塞顿开

于是,集合这一强大的数据结构便应时而生!从技术发展的历史脉络来看,随着软件架构的不断演进和应用场景的日益复杂,Spring 以其高度的灵活性、可扩展性和强大的功能,逐渐成为了众多开发者的首选。核心知识总结的知识点除上述所提及的内容之外,还涵盖了诸多重要的领域,例如 Netty 与 RPC 方面,Netty 作为高性能的网络通信框架,在构建分布式系统中的作用举足轻重,而 RPC 则为远程过程调用提供了高效的解决方案;从社会应用的层面分析,在当今信息爆炸的时代,各种类型的软件和系统对于数据的处理要求愈发严苛。

IT_1024_的博客 726
上一篇: Java异常处理最佳实践及陷阱防范
Java_No2
博客等级 码龄7年 20粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值