阿里P8级架构师花四小时让你搞懂JVM底层原理(附JVMpdf)

JVM 详解 PDF 文档、JVM 详解 PDF 文档 私信可以免费送。 本文详细讲解了JVM(Java Virtual Machine)的方方面面,首先由java的特性来描绘JVM的大致应用,再细细阐述了JVM的原理及内存管理机制和调优.最后讲述了与JVM密切相关的Java GC机制. 立即下载

JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易。JVM 的知识点太散,不系统,所以不便于归纳总结,今天就来帮大家解决这个问题,用一篇文章把 JVM 的结构讲清楚。

JVM 可分为 5 个部分,分别是:

1、类加载器(Class Loader)

2、运行时数据区(Runtime Data Area)

3、执行引擎(Execution Engine)

4、本地库接口(Native Interface)

5、本地方法库(Native Libraies)

这其中最复杂的是运行时数据区,又可分为方法区、虚拟机栈、本地方法栈、堆、程序计数器,并且方法区和堆是线程共享的,虚拟机栈、本地方法栈、程序计数器是线程隔离的,JVM 的结构如下图所示。
在这里插入图片描述
搞清楚了 JVM 虚拟机的结构,接下来我们详细讲解它的每一部分。
类加载器:加载字节码文件到内存。
执行引擎:对 JVM 指令进行解析,翻译成机器码,解析完成后提交到操作系统中。
本地库接口:供 Java 调用的融合了不同开发语言的原生库。
本地方法库:Java 本地方法的具体实现。
行时数据区:JVM 核心内存空间结构模型。

运行时数据区是 JVM 内存结构最重要的部分,接下来我们详细讲解运行时数据区的各个组成部分。

1、方法区

方法区存储虚拟机加载的类信息、常量、静态变量,即时编译器编译后的代码等数据。方法区是一种规范,永久代是方法区的一种实现,这里有个常考的面试题:JDK 7 以前的版本字符串常量池是放在永久代中的,JDK 7 将字符串常量池移动到了堆中,JDK 8 直接删除了永久代,改用元空间替代永久代。

2、本地方法栈

本地方法栈与 Java 栈的作用和原理基本相同,都可以用来执行方法,不同点在于 Java 栈执行的是 Java 方法,本地方法栈执行的是本地方法。

什么是 Java 的本地方法?Java 是基于应用层的高级编程语言,无法访问操作系统底层信息,如底层硬件设备等,这个时候就需要使用其他语言来完成功能了,比如 C 语言,本地方法的使用原理如下所示:
1、在 Java 程序中声明 native 修饰的方法,只有方法定义,没有方法实现,将该 Java 文件编译成字节码文件。
2、用 javah 编译字节码文件,生成一个 .h 文件。
3、写一个 .cpp 文件实现 .h 文件中的方法。
4、将 .cpp 文件编译成动态链接库文件 .dll 。
5、使用 System.loadLibrary() 加载动态连接库文件。

这样就可以实现本地方法的调用,用 Java 调用非 Java 编写的接口,基本原理是利用反射机制,在运行的时候找到 .dll 文件并且解析,根据动态链接库中的文件名称创建出对象和方法,然后我们就可以利用对象调用方法了。

常见的本地方法有:public final native Class<?> getClass()、public native int hashCode()、protected native Object clone()。

3、程序计数器

程序计数器占用的内存空间较小,是当前线程所执行的字节码行号指示器,通过改变这个计数器的值来选取下一条需要执行的字节码指令。多个线程之间的程序计数器相互独立,互不影响,为了保证每个线程都恢复后都可以找到具体的执行位置。

4、Java 堆

Java 堆用来存放实例化对象,Java 堆被所有线程共享,在虚拟机启动时创建,用来存放对象实例,是 Java 内存结构中的大头,占用大部分的空间,是 GC 的主要管理区域,又可分为年轻代、老年代、永久代,JDK 8 及以后去掉了永久代。

年轻代

年轻代又可分为 Eden,from Survivor,to Survivor。

Eden区:对象刚被创建的时候,存放在 Eden 区,如果 Eden 区放不下,则放在 Survivor 区,甚至老年代中。

Survivor 区:Survivor 又可分为 Survivor From 和 Survivor To,GC 回收时使用,将 Eden 中存活的对象存入 Survior From 中,下一次回收时,将 Survior From 中的对象存入 Survior To 中,清除 Survior From ,下一次回收时重复次步骤,Survior From 变成 Survior To,Survivor To 变成 Survivor From,依次循环,同时每次回收,对象的年龄都 +1,年龄增加到一定程度的对象,移动到老年代中。

老年代

存放生命周期较长的对象。JDK 8 之后改用元空间替代永久代。

元空间

Java 8 之后开始将类的元数据放在堆内存中,这块区域叫做元空间,在 Java 7 及以前,元空间是放在永久代中的,Java 8 之后分离出来了。

元空间和永久代是方法区的实现,方法区只是一种规范,在 Java 7 之后,原先位于方法区永久代里的字符串常量池已被移动到了 Java 堆中,因为永久代的内存空间极为有限,如果频繁调用 inter 方法,内存无法存储这么多数据。在 Java 8 之后将永久代完全删除了,使用元空间替代了永久代。

元空间使用本地内存,永久代使用 JVM 内存,所以使用元空间的好处在于程序的内存不在受限于 JVM 内存,本地内存剩余多少空间,元空间就可以有多大,解决了空间不足的问题。

5、虚拟机栈

Java 方法执行的内存模型,Java 栈中存放的是多个栈帧,每个栈帧对应一个被调用的方法,主要包括局部变量表、操作数栈、动态链接、方法返回地址(方法出口)。每一个方法的执行,JVM 都会创建一个栈帧,并且将栈帧压入 Java 栈,方法执行完毕,该栈帧出栈。
在这里插入图片描述
局部变量表:存储方法执行过程中的所有变量,包括方法中声明的局部变量和形参。

操作数栈:方法中的计算过程都是借助于操作数栈来完成的,将参与计算的数据压入操作数栈,
栈的具体运算方式是这样的,编译器是通过两个栈来实现的,一个是保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,直接压入操作数栈。当遇到运算符,先与运算符栈的栈顶元素进行比较,如果高于当前栈顶元素的优先级,直接压入,否则取出当前栈顶的运算符,同时取出操作数栈的前两个数据进行运算,并将结果压入操作数栈。再次重复上述步骤,直到当前的运算符被压入栈中,当没有新的运算符需要入栈的时候,取出当前的栈顶元素以及操作数栈的两个运算,进行运算,将结果压入操作数栈,如果方法定义时需要返回值,直接将操作数栈栈顶元素返回即可。

方法返回地址:一个方法调用结束之后要返回到调用它的地方,所以栈帧中要保持能够返回到方法调用处的地址。

每个线程都有自己的 Java 栈,相互独立,可以同时执行各种的方法,每个方法的执行都是一个栈帧的入栈和出栈过程,Java 虚拟机栈用来存储栈帧,方法调用结束之后,帧会被销毁。

以上就是 JVM 的内存结构,你都学会了吗?
在这里插入图片描述
然后小编这里整理好了 相关的java面试题的PDF,需要领取的小可爱可以注意观看下方的领取方式噢

1.JAVA资源分享:大厂面试解析+架构笔记+进阶学习PDF+精选视频资源

2.Python资源分享:python爬虫+数据分析+办公自动化+全栈开发+人工智能+面试真题分享+精选视频
在这里插入图片描述

全面理解JVM虚拟机.pdf 立即下载

相关推荐

JVM指令手册详细完整版.pdf

JVM指令手册详细完整版.pdf

一文带你读懂JVM内存机制,深入JVM核心知识(PDF文档)

JVM是Java Virtual Machine(Java 虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是平台无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平...

weixin_46329358的博客 350

JVM系列之性能调优参考手册(实践篇).pdf

JVM系列之性能调优参考手册(实践篇).pdf,资源分享达人

JVM内存区域划分附带PDF

前言: 对 Java 程序员来说我们不用自己手动管理对象内存的申请与释放,全部交由 Java 虚拟机(JVM)来管理内存的分配与回收。 因此,日常开发中我们不用关心内存分配与回收,减少了很多繁琐的工作,大大提高了开发效率。 也正是因为如此,一旦出内存泄漏和溢出方面的问题,如果不了解 JVM 内部的内存结构、工作机制,那么排查问题将变得异常艰难。 接下来,我们一起学习 JVM 内存区域的划分、作用以及可能产生的问题。 根据 Java 虚拟机规范,Java 虚拟机在执行 Java 程序的过程中会把它所管

m0_67788957的博客 631

JVM.pdf_jvm_

jvm面试题精选。快速应对jvm问题,全面了解jvm概况。

精简版JVM总结.pdf

JVM 内存区域 线程私有 程序计数器 当前线程所执行的字节码的行号指示器 对于 Java 方法,记录正在执行的虚拟机字节码指令的地址;对于 native 方法,记录值为空 (Undefined) 唯一一个Java 虚拟机规范中没有规定任何 OutOfMemoryError 的内存区域 Java 虚拟机栈 每个线程都有独自的虚拟机栈,并且在栈中的结构是栈帧,当调用一个方法时,会为这个方法 创建一个栈帧,每个方法对应的是入栈、出栈的过程 栈帧中包括局部变量表、操作数栈、动态链接、方法出口等信息 线程请求的栈深度大于虚拟机规定的栈深度,会抛出 StackOverflowError,当栈空间动态扩 展,但无法申请足够的内存,将抛出 OutOfMemoryError 本地方法栈 与虚拟机栈类似,区别在于虚拟机栈执行Java方法,本地方法栈执行 Native 方法

从GitHub火到头条,这套万人期待的JVM 成神之路PDF,现在终于开源了

学习 Java 虚拟机,先要掌握其基本结构,了解各部分有什么作用,各部分之间是如何协调工作的。JVM 的知识体系庞大,覆盖的知识点多,非系统的学习难以学透。理论毕竟是理论,面对实际问题,我们需要的是解决方案。JVM 的版本更新太快,很多资料较为陈旧,跟不上实际应用的步伐。导致现在 JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。

jjc4261的博客 219

利用WI生成无线信道数据

选取DeepMIMO的一个射线追踪场景O1(Outdoor 1)Scenario,工作频率为3.5GHz。有两条街和一个十字路口的户外场景18个基站和超过一百万个用户18个基站(BSs):BS1-BS18.每个基站的高度是8米每个基站的天线阵列是isotropic天线三个统一的x-y用户网格用户的总计数量为:1184923每个用户网格中的第一个用户总是(x,y)坐标最低的用户 所有用户的高度是2m每个用户的每个天线阵列是isotropic天线定义射频追踪场景。

bingbingaidaima的博客 5610

java的底层实现原理pdf_揭秘Java虚拟机:JVM设计原理与实现 完整pdf扫描版[186MB]...

《揭秘Java虚拟机:JVM设计原理与实现》从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型。数据结构部分包括Java字节码文件格式、常量池解析、字段解析、方法解析。每一部分都给出详细的源码实现分析,例如字段解析一章,从源码层面详细分析了Java字段重排、字段继承等关键机制。再如方法解析一章,给出了Java多态特性在源码层面的...

weixin_32165903的博客 513

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

学习笔记|多组率卡方检验和Fisher确切法|个案加权|规范表达|《小白爱上SPSS》课程:SPSS第十六讲 | 多组率卡方检验和Fisher确切法

Medlar_CN的博客 2965

Vivado固化程序与Flash型号添加实战指南

本文详细介绍了Vivado程序固化到Flash芯片的完整流程,包括基础操作、Flash型号添加方法及疑难问题排查。针对Vivado官方支持列表缺失的Flash型号,提供了手动添加配置的详细步骤和参数说明,并分享了高级技巧与安全操作建议,帮助开发者高效完成FPGA程序固化。

weixin_29291573的博客 568

阿里P9级架构师马士兵花四小时让你搞懂JVM底层原理(附JVMpdf)

它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,并配以日常工作中可能会碰到的疑难案例,引领读者轻松踏上探索Java虚拟机的旅途,是广大对Java虚拟机感兴趣的读者的福音!马士兵用四个小时时间,带你走进JVM实战调优的世界,帮助你在面对那些上亿用户,千万QPS,百万TPS,以及每天上PB级大数据量处理系统的时候,不再胆怯,不再心虚,开启涨薪升级之旅!马士兵老师,清华大学,推动Java生根中国,推动大数据生根中国,推动AI生根中国,视频课程下载次数累计数27000万次。

m0_63437643的博客 990

Cadence仿真数字电路功耗

Cadence仿真数字电路功耗 数字电路的功耗采用平均电流乘电源电压获得,所以本文的关键是测量平均电流。 仿真前设置好仿真参数后,在仿真的ADE街边选择:outputs➡to be saved➡select on design 选择电源的负端电流(若选择正端,则电流为负): 选择完成后,在ADE界面讲所选节点的plot也勾选上,点击run。仿真完成后自动显示波形。在波形上选中该电流曲线,右击选择:send to➡calculator 注意上图中,商店前的波形不稳定,需要进行截取。在calculator

qq_41519780的博客 1万+

Jvm的垃圾回收算法详解+第三版PDF分享

Jvm中垃圾回收算法主要分为以下四种 1.标记-清除算法 2.复制算法 3.标记-整理算法 4.分代收集算法 下面我们来详细说说这几种算法 1.标记-清除算法 过程:首先从GCROOT开始,向下扫描标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 即 扫描—标记----清除 缺点:标记和清除两个过程的效率不高,还有就是标记清除之后会产生大量不连续的内存碎片,这样在分配大对象的时候,无法找到足够的连续内存提前触发一次GC 2.复制算法 过程:为了解决标记–清除算法的效率问题,复制算法将内存分

凝孑哒哒哒的博客 1230

生信分析实战指南:Linux环境下EMBOSS的安装与核心功能详解

本文详细介绍了在Linux环境下安装和使用EMBOSS工具包的实战指南,涵盖源码编译、包管理器安装和Conda安装三种方法,并演示了序列比对、序列特征提取和引物设计等核心功能。EMBOSS作为生物信息学领域的开源工具集,适用于序列分析、蛋白质结构预测等多种任务,帮助研究人员高效完成生信分析工作。

weixin_29202213的博客 466

手把手教你用Pytorch代码实现Transformer模型(超详细的代码解读)

本文整理了非常清楚的Transformer模型结构图,建议大家在看代码的时候能结合这个结构图来理解,这样理解起来会比较容易! 用Pytorch实现Transformer的完整代码

捡起一束光的博客 7万+

2024年小白都能看懂的 JVM 知识,一文带你学会 JVM 内存模型!,字节大神强推千页PDF学习笔记

即使是面试跳槽,那也是一个学习的过程。只有全面的复习,才能让我们更好的充实自己,武装自己,为自己的面试之路不再坎坷!今天就给大家分享一个Github上全面的Java面试题大全,就是这份面试大全助我拿下大厂Offer,月薪提至30K!我也是第一时间分享出来给大家,希望可以帮助大家都能去往自己心仪的大厂!为金三银四做准备!笔者已经把面试题和答案整理成了面试专题文档本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

2301_82243799的博客 727

Python爬虫:抓取外卖平台餐厅菜单、价格与评价数据

美团外卖:国内领先的外卖平台之一,提供餐饮外卖、超市配送等服务。饿了么:另一大主流外卖平台,覆盖广泛的餐饮品类。等:国际性的外卖平台。在本文中,我们将以美团外卖为例,展示如何抓取餐厅的菜单、价格和评价等数据。我们会使用Python的爬虫库,如Scrapy和Selenium,来解决抓取任务。本文详细介绍了如何使用Python爬虫抓取外卖平台上的餐厅菜单、价格、评价等信息。我们展示了如何使用Scrapy和Selenium抓取静态与动态网页数据,如何清洗和存储数据,并讨论了如何应对外卖平台的反爬虫机制。

2201_76125261的博客 1500

还不懂JVM的设计原理与实现?这份《jvm虚拟机pdf》给你整的明明白白的

本书从源码角度解读HotSpot的内部实现机制,本版本主要包含三大部分一JVM数据结 构设计与实现、执行引擎机制及内存分配模型。数据结构部分包括Java字节码文件格式、常量池解析、字段解析、方法解析。每一部分都给出详细的源码实现分析,例如字段解析一章,从源码层面详细分析了Java字段重排、字段继承等关键机制。再如方法解析一章,给出了Java多态特性在源码层面的实现方式。本书通过直接对源代码的分析,从根本上梳理和澄清Java领域中的关键概念和机制。

Java_ttcd的博客 568

辉芒微教程第五篇《定时器0实现LED灯闪烁》

定时器定时器,一听就跟个闹钟似的,对于嵌入式定时器大部分的应用中,也的确可以这么理解,但是这只能肤浅地这么理解,实际其功能不仅仅是用来计数定时,但是对于我们这种8位单片机,这么理解就够了。

qq_41809823的博客 725

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

阿里P8架构师爆肝分享内部开源的JVM垃圾回收PDF文档,共23.3W字

本文讲解的内容是关于垃圾回收(Garbage Collection,GC)的文档 ,为什么要写关于垃圾回收的文档呢? 首先,垃圾回收对应用影响很大,主要表现在应用停顿时间、吞吐量、资源使用等方面,开发者选择一种语言时考虑的一个重要因素就是该语言是否支持垃圾回收以及支持哪些垃圾回收实现(要综合考虑开发难度、效率和运行效率)。

公众号:该用户快成仙了 152

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java——JVM篇,2024年最新javaweb面试宝典pdf

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。

m0_60607971的博客 408

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

下一篇: 二本菜鸡试水 iQIYI,刷题1000+,成功水过一二三面
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值