【JVM从小白学成大佬】2.Java虚拟机运行时数据区

  • 时间:
  • 浏览:3
  • 来源:大发时时彩_时时彩链接_大发时时彩链接

这里亲戚亲戚我我想要们都先说句题外话,相信亲戚亲戚我我想要们都在面试中老会 被问到介绍Java内存模型,我在面试别人时也会老会 问你这一 什么的问题。只要,往往一定会令我比较尴尬,我还话音未落,面试者就会“背诵”一段(Java虚拟机时有堆、土土办法去、虚拟机栈,吧啦吧啦。。。),估计心里还一脸自豪的想幸好哥提前在网上搜过,早有准备。每每你这一 后后,我有的是忍心打断,只要“背诵”的真的太顺畅了!

这也怪不得面试者,首先Java虚拟机方面的知识,对中高级程序池池猿来说,工作中正面接触Java虚拟机的东西不要 。其次,你这一 其次咱得好好唠唠,网上搜个Java内存模型,度娘推的第一页大有的是介绍Java运行时数据区的,起到了一定的误导作用,大写的尴尬。

本篇将给各位小伙伴先删剪介绍Java运行时数据区的组成,Java内存模型也是虚拟机上方的重点,上方会单独抽出一篇来进行介绍。

1.运行时数据区介绍

程序池池运行所需的内存空间,一点是可不还能否 在编译期就能选取,得要在运行期根据实际运行情況动态地在系统中创建。Java虚拟机在执行Java程序池池的过程中会把它所管理的内存划分为若干个不同的数据区域。哪几种区域有的是个人所有所有的用途,以及创建和销毁的时间,有的区域随着虚拟机程序池池的启动而趋于稳定,一点区域则依赖用户程序池的启动和结束了了英语 英语 而建立和销毁。

如图所示,堆和土土办法区是所有程序池共享的公共区域,堆和土土办法区所占的内存空间是由JVM负责管理的,在该区域内的内存分配是由HotSpot的内存管理模块维护的,而内存的释放工作则由垃圾挂接器自动完成。虚拟机栈、本地土土办法栈、程序池池计数器是程序池的私有区域,每个程序池都关联着唯一的栈和程序池池计数器,并仅能使用属于自己的那份栈空间和程序池池计算器来执行程序池池。

2.堆(Heap)

对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。堆是可供各个程序池共享的运行时内存区域,在虚拟机启动的后后就被创建。此内存区域的唯一目的只要存放对象实例,几乎所有的对象实例有的是这里分配内存。你这一 点在Java虚拟机规范中的描述只要:所有的对象实例以及数组对象有的是在堆上分配。只要随着JIT编译器的发展与逃逸分析技术逐渐心智心智旺盛期的句子的句子 是什么是什么是什么期,栈上分配、标量替换优化技术只要是因为 一点微妙的变化趋于稳定,所有的对象都分配在堆上也渐渐变得有的是上可不还能否 “绝对”了。

Java堆的容量上可不还能否 是固定的,也上可不还能否 随着程序池池执行的需求动态扩展,并在不都要不要 空间时自动收缩。Java堆上可不还能否 趋于稳定物理上不连续的内存空间中,只要逻辑上是连续的即可。只要在堆中上可不还能否 内存完成实例分配,只要堆也无法再扩展时,只要抛出OutOfMemoryError异常。

Java堆是垃圾挂接器管理的主要区域,只要只是 后后也被称做“GC堆”(Garbage Collected Heap)。从内存回收的厚度来看,只要现在挂接器基本都采用分代挂接算法,Java虚拟机将堆划分为新生代和老年代。其中,新生代又被分为Eden区,以及五个 大小相同的Survivor区(From Survivor,To Survivor)。默认情況下,Java虚拟机采取的是一种 动态分配的策略(JVM参数-XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的下行速率 ,以及Survivor区的使用情況,动态调整Eden区和Survivor区的比例。也上可不还能否 通过参数(SurvivorRatio)来调整你这一 比例,SurvivorRatio你这一 参数只要新生代中Eden区与Survivor区的容量比值,默认是8,代表Eden:Survivor=8:1。

否有只要五个 对象共用一段内存的事故?

当调用new指令时,会在Eden区划出一块作为存储对象的内存。只要堆空间是程序池共享的,只要直接在这上方划空间是都要进行同步的。只要,将有只要老会 出先五个 对象共用一段内存的事故。出理 土土办法只要,Java堆中只要划出多个程序池私有的分配缓冲区TLAB(Thread Local Allocation Buffer,对应的虚拟机参数-XX:+UseTLAB,默认开启)。

具体来说,每个程序池上可不还能否 向Java虚拟机申请一段连续内存,比如2048字节,作为程序池私有的TLAB。你这一 操作都要加锁,程序池都要维护五个 指针(实际上只要更多,但重要也就五个 ),五个 指向TLAB中空余内存的起始位置,五个 则指向TLAB末尾。接下来的new指令,便上可不还能否 直接通过指针加法(bump the pointer),有的是人叫做指针碰撞来实现,即把指向空余内存位置的指针加上所请求的字节数。只要加法后空余内存指针的值仍小于或等于指向末尾的指针,则代表分配成功。只要,TLAB只要上可不还能否 足够的空间来满足本次新建操作。你这一 后后,便都要当前程序池重新申请新的TLAB。

3.土土办法区(Method Area)

土土办法区与堆一样是程序池共享的,在虚拟机启动的后后创建,土土办法区可视为堆的五个 逻辑偏离 ,只要它却五个 别叫金做Non-Heap(非堆),目的应该是与Java堆区分开来。

土土办法区相似 于传统语言编译后的代码存储区域,它存储每个类的行态信息,如:

  • 常量池
  • 土土办法数据
  • 土土办法和构造函数的字节码
  • 类、实例、接口初始化时用到的特殊土土办法

备注:《深入理解Java虚拟机》里将土土办法区归纳为用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

Java虚拟机规范对土土办法区的限制非常宽松,除了和Java堆一样不都要连续的内存和上可不还能否 选取固定大小只要可扩展外,还上可不还能否 选取不实现垃圾挂接。这区域的内存回收目标主只要针对常量池的回收和对类型的卸载。

4.程序池池计数器(Program Counter Register)

Java虚拟机上可不还能否 支持多条程序池一起去执行,每一根Java虚拟机程序池有的是自己的程序池池计数器。在任意时刻,一根Java虚拟机程序池只会执行五个 土土办法的代码,你这一 正在被程序池执行的土土办法称为该程序池的当前土土办法(current methon)。只要你这一 土土办法有的是native的,那程序池池计数器保存的只要Java虚拟机正在执行的字节码指令的地址。只要该土土办法是native土土办法,那程序池池计数器的值为空(undefined)。程序池池计数器的容量为宜应当保存五个 returnAddress类型的数据只要五个 与平台相关的本地指针的值。

程序池池计数器是一块较小的内存空间,它上可不还能否 看作是当前程序池所执行的字节码的行号指示器。此内存区域是唯五个 在Java虚拟机规范中上可不还能否 规定任何OutOfMemoryError情況的区域。

5.虚拟机栈(VM Stack)

每一根Java虚拟机程序池有的是自己私有的Java虚拟机栈,它的生命周期与程序池相同。虚拟机栈描述的是Java土土办法执行的内存模型:每个土土办法在执行的一起去一定会创建五个 栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、土土办法出口等信息。每五个 土土办法从调用直至执行完成的过程,就对应着五个 栈帧在虚拟机栈中入栈到出栈的过程。

Java虚拟机栈只要趋于稳定如下异常情況:

  • 只要程序池请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机只要抛出五个 StackOverflowError异常。
  • 只要Java虚拟机栈上可不还能否 动态扩展,只要在尝试扩展的后后无法申请到足够的内存,只要在创建新的程序池时上可不还能否 足够的内存区创建对应的虚拟机栈,那Java虚拟机只要抛出五个 OutOfMemoryError异常

6.本地土土办法栈(Native Method Stack)

本地土土办法栈与虚拟机栈所发挥的作用是非常相似 的,它们之间的区别不过是虚拟机栈为虚拟机执行Java土土办法(也只要字节码)服务,而本地土土办法栈则为虚拟机使用到的native土土办法服务。

Java虚拟机规范允许本地土土办法栈实现成固定大小只要根据计算来动态扩展和收缩。只要采用固定大小的本地土土办法栈,上可不还能否 每五个 程序池的本地土土办法栈容量上可不还能否 在创建栈的后后独立选定。

与虚拟机栈一样,本地土土办法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。

7.扩展知识点

7.1 栈上分配和逃逸分析

在栈中分配的基本思路是后后的:分析局部变量的作用域仅限于土土办法内内外部,则JVM直接在栈帧内分配对象空间,出理 在堆中分配。你这一 分析过程称为逃逸分析(有的是叫逸出分析),而栈帧内分配对象的土土办法称为栈上分配

后后做的目的是减少新生代的挂接次数,间接提高JVM性能。虚拟机是允许堆逃逸分析开关进行配置的,从Sun Java 6u23后后,HotSpot默认开启逃逸分析。

7.2 栈帧

栈帧是用于支持虚拟机进行土土办法调用和土土办法执行的数据行态,它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了土土办法的局部变量表、操作数栈、动态连接和土土办法返回地址等信息每五个 土土办法从调用结束了了英语 英语 至执行完成的过程,都对应着五个 栈帧在虚拟机栈上方从入栈到出栈的过程。

在编译程序池池代码的后后,栈帧中都要多大的局部变量表,多深的操作数栈都只要删剪选取了,只要写入到土土办法表的Code属性之中。只要五个 栈帧都要分配好多个内存,时会收到程序池池运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。

五个 程序池中的土土办法调用链只要会很长,只是 土土办法都一起去趋于稳定执行情況。对于执行引擎来说,在活动程序池中,上可不还能否 趋于稳定栈顶的栈帧才是有效的,称为当前栈帧(Current Stack Frame),与你这一 栈帧相关联的土土办法称为当前土土办法(Current Method)。执行引擎运行的所有字节码指令都只针对当前栈帧进行操作。栈帧的概念行态如下:

8.运行时数据区脑图

猜你喜欢

古建筑修复中用到的现代化仪器设备与科学技术

核心提示:有着千年历史的古代建筑文物,不仅为当代人展现了古大伙富有的想象力与强大的智慧生活 ,还可帮助大伙了解古代文化、一窥古代文明。但随着时间的次责,历史悠久的古建筑始终难

2019-09-20

古代十种祥瑞之兽,如果让你选一个做保护神的话你选谁?

你还能能发布    发布日期:2017-02-0815:22:39核心提示:一、麒麟(qln):中国传统瑞兽,性情温和,传说能活两千年。古人认为,麒麟出没处,必有祥瑞。本文标题

2019-09-20

《万王之王3D》传承装备怎么获得 传承装备解析一览

您当前的位置:首页>游戏攻略>手游攻略>《万王之王3D》传承装备为什么在么在获得传承装备解析一览 更新时间:2018-08-2817:00:43来源:斗蟹游

2019-09-20

山东电信19元王卡套餐附赠诸多专属优惠

最近为响应国家“提速降费”的要求,各大电信运营商纷纷推出新业务,资费竞争也异常激烈。据悉,山东地区运营商之间的竞争尤为引人注目。有消息称,近期山东电信推出了超值优惠的王卡业务,

2019-09-19

易思ESPCMS企业建站管理系统集成包|易思ESPCMS企业建站管理系统集成包 P8.19082801稳定版下载

ESPCMS是首款以微信+手机APP+微网站+手机短信+多语言网站全方组合的企业营销管理平台,采用于PHP和MYSQL黄金组合进行开发,并能稳定运行于国内各大空间主机及主流的服

2019-09-19