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

转载自  Java虚拟机必学之四大知识要点,附学习资料

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

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

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

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

1、从虚拟机视角来看

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

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

 

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

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

2、从硬件视角来看

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

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

 

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

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

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

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

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

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

 

 第三大知识要点: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 内存模型是通过内存屏障来禁止重排序的。对于即时编译器来说,内存屏障将限制它所能做的重排序优化。对于处理器来说,内存屏障会导致缓存的刷新操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ消息可靠性 (投递+消费)

文章目录Rabbitmq的消息可靠性投递Rabbitmq的消息可靠性投递confirmCallbackRabbitmq的消息可靠性投递returnCallbackRabbitmq的消息确机制ACKRabbitmq的消息可靠性投递 什么是消息的可靠性投递 保证消息百分百发送到消息队列中去 1 保证mq节点成功接受消息&#xff0c;消息发…

jzoj4024-石子游戏【SG函数,博弈论】

正题 大意 有n堆石头&#xff0c;每堆石头有aiai个每次可以拿走一堆或者Y个&#xff08;仅当gcd(Y,ai)1gcd(Y,ai)1&#xff09;。拿走最后一堆石头的人就赢了&#xff0c;两个人都是聪明绝顶的。 解题思路 考虑构建SG函数&#xff1a; SG(x)mex(SG(x−y)(gcd(x,y)1) υ …

程序配置amp;amp;ConfigurationManager

配置组件是.net framework中非常常用的功能。在创建.net framework 工程时&#xff0c;系统不仅会自动生成app.config文件&#xff0c;而且还提供了非常强大的访问类库。但是这些好东西&#xff0c;在.net core 2.0中已经不复存在&#xff0c;至少说没有.net framework 中那么完…

既然参与,那就做好,我相信我们是最棒的!!!

‍‍大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天是3班的KTV项目答辩&#xff0c;也是20级的最后一个班级&#xff0c;连续6天的KTV项目答辩终于告一段落。回顾各班所做的项目&#xff0c;通过我自己参与点评的以及从班内参观同学…

又发生频繁FGC,这次是谁的锅

转载自 又发生频繁FGC&#xff0c;这次是谁的锅 这是笨神JVMPocket群里一位名为"云何*住"的同学提出来的问题&#xff0c;问题现象是CPU飙高并且频繁FullGC。 重现问题 这位同学的业务代码比较复杂&#xff0c;为了简化业务场景&#xff0c;笔者将其代码压缩成如…

jzoj4025-找回密码【后缀自动机】

正题 大意 一个字符串&#xff0c;要求第k小的子串。 解题思路 先建立一个后缀自动机&#xff0c;然后用一个numinum_inumi​表示第iii个节点的可以到达的点所表示的子串总和&#xff0c;然后从第1号点开始查找&#xff0c;判断一下找到第k小所在的节点后&#xff0c;然后查找…

三个剩两个,两个剩一个,最后一个都没剩下。

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天文章的标题本来是&#xff1a;“从未见过如此不要脸耍无赖的人&#xff01;&#xff01;&#xff01;”&#xff0c;后来想了想&#xff0c;毕竟公众号里面还有那么多不同身份的粉丝&a…

算法面试,如何在100 亿URL中判断某个URL是否存在

转载自 算法面试&#xff0c;如何在100 亿URL中判断某个URL是否存在 如果面试官问你&#xff0c;一个网站有 100 亿 url 存在一个黑名单中&#xff0c;每条 url 平均 64 字节。问这个黑名单要怎么存&#xff1f;若此时随便输入一个 url&#xff0c;如何判断该 url 是否在这个…

链表 题

文章目录找出链表中类中点的位置判断该链表是否为回文结构将单向链表按某值划分成左边小、中间相等、右边大的形式给定一个有next指针和rand指针的Node 组成的无环单链表头节点&#xff0c;实现一个函数完成链表的复制&#xff0c;返回新链表的头节点给定两个可能有环也可能无环…

.NET Core 2.0迁移技巧之web.config配置文件

大家都知道.NET Core现在不再支持原来的web.config配置文件了&#xff0c;取而代之的是json或xml配置文件。官方推荐的项目配置方式是使用appsettings.json配置文件&#xff0c;这对现有一些重度使用web.cofig配置的项目迁移可能是不可接受的。 但是好消息是&#xff0c;我们是…

jzoj2136-(GDKOI2004)汉诺塔【找规律,模拟】

正题 大意 将汉诺塔的规则改为只能移动到相邻的柱子&#xff0c;然后求有n个圆盘时在第m步时每个盘所在的位置。 解题思路 我们先将3个盘的移动情况推出来&#xff1a;(1,1,1)->(2,1,1)->(3,1,1)->(3,2,1)->(2,2,1)->(1,2,1)->(1,3,1)->(2,3,1)->(3,…

学会它,可以替你写100行 200行 300行……的代码

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。今天&#xff0c;给大家分享一个非常非常使用的小技巧&#xff0c;那就是&#xff1a;“在webstrom中创建一个简单的vue模板”&#xff0c;根据这个方法&#xff0c;你可以任意的创建html模…

Java中随机数的原理,以及使用时的注意点

转载自 Java中随机数的原理&#xff0c;以及使用时的注意点 1 前言 一提到 Java 中的随机数&#xff0c;很多人就会想到 Random&#xff0c;当出现生成随机数这样需求时&#xff0c;大多数人都会选择使用 Random 来生成随机数。Random 类是线程安全的&#xff0c;但其内部使…

MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

dotnet core 2.0 发布已经好几天了&#xff0c;期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0&#xff0c;升级过程还是比较顺利的&#xff0c;变动也不是太多。升级的过程中也少不了 Entity Framwork Core 的升级&#xff0c;在这篇文章中主要介绍下 MySql 数据库使用…

下午带着几个同学打了两节课的牌~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。大赛的项目目前正在火热进行中&#xff0c;靳天宇小组做的是扑克牌的游戏&#xff0c;除了要做大家耳熟能详的“斗地主”之外&#xff0c;另外在我的建议下准备再加两种玩法&#xff0c;一…

Java 0xffffffff隐式类型转换的坑

一、场景复现 项目需求&#xff0c;long的低32位存储ip地址&#xff0c;需要将ip信息展示成为字符串ip。 public static void main(String[] args){long ipLong 0x457145130A1901F6L;String ip longToIp(ipLong&0xffffffff);//取低32位System.out.println(ipLong);Syst…

jzoj2137-(GDKOI2004)城市统计【二维前缀和,bfs】

正题 大意 有n*n的矩阵&#xff0c;有居民区有商业区&#xff0c;每个居民区曼哈顿距离最近的商业区的曼哈顿距离就是那个居民区离商业区的距离。每个格子统计一下以它为中心的2∗r12∗r12∗r12∗r1的矩阵内所有居民区离商业区的距离的和。 解题思路 先bfs计算所有居民离商业…

Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍

Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了&#xff0c;一下子Net圈热闹了起来&#xff0c;2.0带来了很多新的特性和新的功能&#xff0c;其中Razor Page引起我的关注&#xff0c;作为web程序员来说&#xff0c;Asp.Net下的任何web框架都会去特别关注&…

二叉 树

文章目录递归方式 先序、中序、后序 遍历非递归方式 先序、中序、后序 遍历实现二叉树的按层遍历求二叉树的最大宽度二叉树的序列化和反序列化二叉树有 left、right、parent &#xff0c;给这样二叉树的某个结点&#xff0c;返回该节点的后继节点折纸条递归方式 先序、中序、后…

“老师,弃了吧,做个别的……”“笑话,都到这个份上了,怎么能弃掉呢?”...

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。最近项目小组一直在按照原计划做项目&#xff0c;聊天程序&#xff08;高仿版微信&#xff09;已经趋于尾声&#xff0c;做的还可以&#xff0c;剩下的就是美化和慢慢的完善小问题了&#…