Redis成神之路电子版教程已问世,太香了
一道面试题
让我们开门见山,直面主题:Dubbo 服务里面有个服务端,还有个消费端你知道吧?
服务端和消费端都各有一个线程池你知道吧?
那么面试题来了:一般情况下,服务提供者比服务消费者多吧。一个服务消费方可能会并发调用多个服务提供者,每个用户线程发送请求后,会进行超时时间内的等待。多个服务提供者可能同时做完业务,然后返回,服务消费方的线程池会收到多个响应对象。这个时候要考虑一个问题,如何将线程池里面的每个响应对象传递给相应等待的用户线程,且不出错呢?
1 JVM的内存区域布局
java代码的执行步骤有三点
- java源码文件->编译器->字节码文件
- 字节码文件->JVM->机器码
- 机器码->系统CPU执行
JVM执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过写java代码阶段,直接生成字节码交由JVM执行
其中Java虚拟机栈、程序计数器、Heap、本地方法栈、Metaspace属于JVM运行时的内存;按是否线程共享则可以分两类
JAVA堆和MetasSpace元空间属于线程共享的;虚拟机栈和本地方法栈、程序计数器是线程私有的
2 JVM五大数据区域介绍
2.1 程序计数器(Progarm Counter Register)
- 一块较小的内存空间, 是当前线程所执行的字节码的行号指示器。线程有一个独属的程序计数器,字节码解析工作时需要程序计数器来选取下一指令,分支、循环、跳转等依赖它
- 正在执行java方法线程的计数器记录的是虚拟机字节码指令的地址;如果还是Native方法,则为空
- 程序计数器内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError错误的区域
2.2 虚拟机栈(Virtual Machine Stack)
- Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息
- 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程
- 栈帧是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接(Dynamic Linking)、 方法返回值和异常分派(Dispatch Exception)。栈帧随着方法调用而创建,随着方法结束而销毁(无论方法是正常完成还是异常完成)
- 如果线程请求的栈深度大于虚拟机允许深度,则抛出StackOverflowError;扩展时无法申请到足够内存,则抛出OutOfMemeryError
2.3 本地方法栈(Native Method Stack)
- 本地方法栈和虚拟机栈作用类似,区别是虚拟机栈为执行Java方法服务,而本地方法栈则为Native方法服务。(HopShot的实现 直接把本地方法栈和虚拟机栈合二为一)
上述3类区域,生命周期与Thread相同,即:线程创建时,相应的内存区创建,线程销毁时,释放相应内存
2.4 堆(Heap)
- 线程共享的一块内存区域,几乎所有的对象实例在这里分配内存,也是垃圾收集器进行垃圾收集的最重要的内存区域。因此很多时候也叫GC堆
- 线程私有的分配缓存区(Thread Local Alloaction Buffer)也是在堆划分出来的
- JDK8的版本,因使用元空间代替永久代,字符串常量池和类的静态变量也放入java堆中
2.5 元空间(MetaSpace)
- 主要存储类的元数据,比如类的各种描述信息,类名、方法、字段、访问限制等,既编译器编译后的代码等数据
- 运行时常量池:Class文件中除了有类的版本、字段、方法等描述等信息外;还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分将在类加载后存放到元空间的运行时常量池中
使用元空间代替永久代原因
- 永久代的大小是在启动时固定好的,很难进行调优;太大则容易导致永久代溢出;太小在运行时,容易抛出OutOfMemeryError
- 字符串存在永久代中,使用时易出问题,由于永久代内存经常不够用,爆出异常OutOfMemoryError: PermGen
CodeCache
- JVM生成的native code存放的内存空间称之为Code Cache;JIT编译、JNI等都会编译代码到native code,其中JIT生成的native code占用了Code Cache的绝大部分空间
直接内存
- 它并不是虚拟机运行时数据区的一般分,也不在规范定义。JDK1.4,引入了Channel(通道)与Buffer(缓存区)的I/O方式,它可以使用Native函数分配堆外内存,可通过DirectByteBuffer操作。
3 JVM运行时内存布局和JMM内存模型区别
- JVM内存区域是指JVM运行时将内存数据分区域存储,强调对内存空间的划分
- JAVA内存模型是Java语言在多线程并发情况下对于共享变量内存操作的规范:解决变量在多线程的可见性、原子性的问题
最后
作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料,如果**‘你’确定好自己未来的道路或者想学习提升自己技术栈、技术知识的小伙伴们可以点击这里来获取免费学习资料提升自己(全套面试文档、PDF、进阶架构视频)**
外链图片转存中…(img-N8LnBi1Q-1619597741588)]
[外链图片转存中…(img-7kiC30iV-1619597741590)]
Redis成神之路电子版教程已问世,太香了相关推荐
- Redis成神之路电子版教程已问世,面试题+笔记+项目实战
前言 我想对所有程序员说:除了看视频.做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书!(本文内提到的书单笔者整理出了一份电子档作为分享,文末有免费获取方式) 网络框架.中间件. ...
- vim 成“神“之路 (一)
文章目录 1. 安装 1.1 linux 1.2 MacOs的安装 1.3 Windows的安装 1.4 vim中文帮助文档安装 2. vim基本概念和基础命令 2.1 基本的键位映射如下: 2.2 ...
- 大数据成神之路(持续更新)
<2021年最新版大数据面试题全面开启更新> <2021年最新版大数据面试题全面开启更新> 已经在公众号更新文章目录: 大数据成神之路-Java高级特性增强 - 大数据成神之路 ...
- Alibaba技术专家倾心五年打造 Java成神之路:基础篇
近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是Java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...
- (上)史上最全 Flink SQL 成神之路(全文 18 万字、138 个案例、42 张图)
1.前言 看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗? 大数据羊说__的文章会让你明白 博主会阐明博主期望本文能给小伙伴们带来什么帮助,让小伙伴萌能直观明白博主的心思 博主会以实际的 ...
- Java成神之路[转]
阿里大牛珍藏架构资料,点击链接免费获取 针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 主要版本 更新时间 备注 v1.0 2015-08-01 首次发布 ...
- JVM成神之路-Java内存模型(JMM)
Java 内存模型基础 什么是 Java 内存模型(JMM-共享内存模型) 内存模型描述了程序中各个变量(实例域.静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量 ...
- java工程师知识架构图图_阿里技术专家教你画架构图、Java 工程师成神之路 | 2019 年 2 月收藏排行...
五一假期,头条君会推送 2019 年 1-4 月 开发者头条 上收藏最多的文章 点击链接或图片 即可阅读 喜欢请 分享到朋友圈 哦 Java 工程师成神之路(2019 正式版) 结构调整,更适合从入门 ...
- Java 工程师成神之路 | 2019正式版 1
Java 工程师成神之路 | 2019正式版 基础篇 01 面向对象→ 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM ...
最新文章
- html如何给文字添加阴影效果,css中怎么给字体添加阴影效果
- C语言中的struct结构体对齐问题
- 用 Python 实现隐身,我可以 | 文末福利
- 鱼和熊掌可以兼得! 天昊生物微生物16S扩增子绝对定量测序检测新模式创双赢!...
- AgileEAS.NET平台开发指南-实现插件
- 深入Java关键字null
- SAP WebClient UI页面标签的决定逻辑介绍
- mysql查询最小的id_Mysql查询表中最小可用id值的方法
- Shell-find+exec
- 华为S5300系列交换机V100R005SPH020升级补丁
- springmvc01
- 大数据测试之hadoop命令大全
- jieba分词的原理
- MySQL的sql大于号(小于号)的使用
- 绕过AppLocker系列之Rundll32的利用
- 争取下周内初步实现AHB的BFM
- P205-下载xkcd漫画
- 通过扫描二维码进入下载APP的流程
- 苹果uwb_苹果电子追踪器即将发布,我们扒了扒产品背后的 UWB 超宽频技术
- 蒲丰投针问题的matlab仿真
热门文章
- 为你搜罗2006年值得推荐的日语学习软件
- 零基础手把手教你制作一个微信小程序云开发-实验室仪器管理系统(二)
- 动画制作可以选用哪些工具? | 万彩动画大师
- 深入研读“ReDet: A Rotation-equivariant Detector for Aerial Object Detection”学习笔记
- C++ 压缩文件及文件夹 使用zlib开源库
- 三 java的基本数据类型_JAVA基础(三)--JAVA基本数据类型
- 基于Onene-step forming的刚度分析
- STM32 GPIO口的配置和应用
- Linux系统管理之LVM案例
- 【从kitti开始自动驾驶】--6.2 全场景2D检测(移植至ROS,显示于RVIZ)