JVM 运行时数据区详解,写得非常好!
云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!
在接下来的几天想总结下,JVM相关的一些内容,比如下面的这三个内容算是比较核心知识点了
1.运行时数据区域: 在运行时数据区里存储类Class文件元数据(方法区),对象和数组(堆),方法参数局部变量(栈)等。
2.垃圾回收机制: java 语言的优势之一就是它的自动内存管理,主要回收运行时数据区域的堆内存里的数据
3.类加载机制: 虚拟机首先需要把编译完成的字节码文件通过类加载器来加载到运行时数据区域
一个段Java代码的生命周期都会少不了上图这几个步骤,也就是Java代码首先会被编译成字节码文件,之后被类加载器加载到运行时数据区域,以及运行,垃圾收集器回收对象等等。
但今天我想介绍第一个知识点《运行时数据区域》
1 运行时数据区
Java虚拟机定义了一系列逻辑数据区域,有些是随着虚拟机的启动而创建,虚拟机的关闭而销毁。还有一部分是随着线程生命周期创建销毁的。
我们有必要深入了解这块的内容,因为它将决定服务器性能,首先我们需要对整个运行时区域由整体的认识并且了解了每个区域的生命周期以及作用之后才能通过相应的调参来提升系统性能。除此之外还有助于快速定位虚拟机的相关Error.
逻辑上可以划出一下6个区域分别是
1.1 PC寄存器
全名叫做 Program Counter Register 既然是叫做寄存器了那么肯定是需要存东西,那到底存的是什呢?
由于JVM同时可以处理多个线程所以就涉及到一些线程调度,当cpu暂停运行线程A把时间片让给线程B的时
候我们需要保存线程A被暂停执行前的一些现场状态,需要记录当前执行到那一行字节码了,所以具备保存现场的功能。
每条线程都有自己的pc寄存器,在任意时刻虚拟机只会执行一个方法,如果执行的是方法不是native方法 pc寄存器则保存指向当前执行字节码的指令地址,如果执行的是native方法 pc寄存器会保存undefined。
1.2 java虚拟机栈
虚拟机栈也是每条线程私有的区域,里头存储栈帧(Frame),后面会重点介绍栈帧算是重点内容。方法的调用与返回基于栈帧来实现的。
1.3 虚拟机堆
在Java虚拟机中堆是所有线程都可以共享的内存区域,是存放所有类实例和数组对象的地方。在虚拟机启动就根据相关堆参数,创建堆,他也是垃圾收集器工作的主要区域。
堆内存里的对象不会被显式的回收,而是由垃圾回收器回收,为了配合垃圾收集器的特性我们可以把堆分为年轻代和老年代。
年轻代又分了Eden和survivor区,主要是为了配合垃圾回收算法而这么搞得。
1.4 方法区和运行时常量池
在Java虚拟机中 方法区是可提供各个线程共享的运行时内存区域,它存储了每一个类的结构信息,例如运行时常量池,字段和方法数据,构造函数和普通函数的字节码内容,一句话总结就是存储元数据地方
运行时常量池是class文件中每个类或接口常量池表的表示形式。它包括了若干不同的常量,比如 从编译期可知的数值字面量到运行时才能解析获得的方法或字段引用等等。
创建时机
每个运行时常量池都在Java虚拟机的方法区中分配,在加载类和接口到虚拟机之后创建对应的运行时常量池
1.5 本地方法栈
如果我们想再Java底层里调用别的语言代码的话就需要用到别的方法栈了,比如Java虚拟机的实现会用到传统的栈(C stack)来调用native方法,这个就是本地方法栈的应用,当然这个不是必须实现的,完全取决于虚拟机的实现。
2 栈帧:
首先看下栈帧在虚拟机内存中在什么位置,
2.1 局部变量表 (Local variable)
每个栈帧内部都包含一组称为局部变量表的列表,变量表的长度在编译期决定。另外关注公众号互联网架构师在后台回复2T获取一份架构全套教程。
一个局部变量可以存储一个基本数据类型或一个对象引用(referance),returnAddress的数据。存储long或double需要两个局部变量才能存储。
当虚拟机要使用局部变量表里的数据时通过索引来定位,默认从0开始,由于long和double占用两个局部变量所以它的索引较特殊,取决于最小的那个值,比如某个long类型数据在索引n和n+1里存储了,那么它对应的索引值就是n.
虚拟机通过局部变量表来完成方法调用时的参数传递。如果是类方法,它的参数依次从0开始的位置传递到局部变量表,如果是实例方法则第0位置存储所在对象的引用(this),从1开始传递参数。
2.2 操作数栈 (Operating Stack)
操作数栈是属于栈帧中的栈,其实它的全名叫做当前栈帧的初操作数栈。栈,栈帧,操作数栈的关系需要梳理清楚:
- 栈:是虚拟机运行时数据区的一个逻辑区域,里面存储了一个个栈帧。
- 栈帧:栈帧代表一个方法的整个生命周期,里头存储了局部变量表,操作数栈,动态链接
- 操作数栈: 刚刚创建时操作数栈是空的。虚拟机提供一些指令从局部变量表把一些常量或者变量值加载到操作数栈,也提供了从操作数栈取走数据的指令。
调用方法时操作数栈用来准备调用方法参数以及接受方法的返回结果。
2.3 动态链接 (Dynamic Linking)。
动态链接是用来完成运行时绑定操作的。在栈帧中有一个指向常量池的当前类的一个引用。在class文件里一个方法要是调用其他方法或者方法其他成员变量,则需要通过符号引用来表示。
- 动态链接的作用就是将符号引用转换为直接引用。
- 类加载的过程中将要解析尚未被解析的符号引用,并且把对变量的访问转换为正确的偏移量。
【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK
原文发布时间:2020-07-30
本文作者:小小木的博客
本文来自:“互联网架构师”,了解相关信息可以关注“互联网架构师”

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
杭州杀妻案告破,警务 AI 也立功了
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 编者按:本文来自微信公众号“HyperAI超神经”(ID:HyperAI),作者:神经小兮,36氪经授权发布。 近日备受关注的「杭州女子失踪案」终于破案,从失踪到立案再到侦破,历时 20 天。调查过程中,警方的工作量巨大,所幸,智慧警务在其中贡献了一份力量,让真相得以更早地被揭开。 关键词:智慧警务 目标检测 特征提取 7 月 25 日,杭州公安局就「杭州杀妻案」举行了新闻通气会,公布侦查结果。和网友们预测的一样:杀害来惠利的真凶,正是其丈夫许国利。 从 7 月 5 日失踪,到 7 月 25 日破获杀人犯,历时 20 天。 杭州警方期间先后 4 次地毯式排查 1 万多平方米地下车库和所有电梯井、水箱、窨井、储物柜、烟道、通风管道,查看 6000 小时的监控录像,冲洗 38 车粪水,走访询问小区 6 幢单元楼、379 户人家、1075 名住户…… 海量的侦查工作中,警务 AI 的介入加速了破案进程。 6000 小时监控视频,警务 AI 助力侦查 关于本案件的来龙去脉,相信很多人已经有所了解...
- 下一篇
GitOps初阶指南:将DevOps扩展至K8S
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在过去十年的编程中,出现了一些革命性的转变。其中之一是源于围绕DevOps的实践,它将开发和运维团队整合到一个共享的工作流程中,此外还有持续集成和持续交付(CI/CD),通过CI/CD,Devops团队可以向代码库提供持续的更新。另一个变革来自于从单体代码库到基于云的微服务的迁移,这些微服务运行在由Kubernetes等编排平台管理的容器中。 即使有Kubernetes这样的平台来编排协调,在集群系统或云端运行的基于容器的应用程序依旧可能是复杂的、难以调配和管理的。GitOps是一套新兴的实践,旨在通过应用Devops和CI/CD世界的技术来简化这一管理任务。 GitOps的关键是基础设施即代码(IaC)的理念,它采用与DevOps用于提供应用程序一样的方法来提供基础设施。所以,不仅是应用,还有底层的主机和网络都被描述在文件中,这些文件可以像版本控制系统中的其他代码一样,然后由自动化流程来将现实世界的应用与这些文件中描述的应用进行融合。 用GitOps的说法,版本控制系统中的代码是关于应...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)