你必须了解的java内存管理机制(二)

  • 时间:
  • 浏览:2
  • 来源:小志资源网_提供南风娱乐网技术_115资源网资讯

  invokespecial指令调用对象实例妙招<init>,通过符号引用#3定位到的是People对象的实例妙招<init>。这并且操作数栈栈顶值(指向对象实例的内存reference)会被弹出(可能性<init>妙招有参数,参数也会出栈)。执行<init>妙招会在java虚拟机栈中创建<init>妙招的栈帧(相关栈和栈帧的介绍看上一篇文章),如保让把出栈的数据贴到 栈帧的局部变量表中。变量表中指向对象实例的内存reference有些有些亲戚亲戚大伙经常用到的this,表示对该对象实例进行操作!执行完该指令后,有兩个多多删改的对象就创建完成啦!

  1)、 指针碰撞

  在上文亲戚亲戚大伙提过有些问题报告 ,你的对象是为什new出来的?new出来又贴到 哪里?为什引用的? 老规矩,亲戚亲戚大伙还是通过字节码来了解一下。

  可能性88两种 值在四根语句中前要重复赋给有兩个多多变量,有些有些使用dup指令对栈顶的值进行了克隆qq好友好友,且压入栈顶。亲戚亲戚大伙在new对象的并且,new指令里边一定会紧跟dup指令!如保让是invokespecial和astore指令,相信聪明的你应该想到invokespecial和astore指令一定会前要从栈顶弹出值来执行!在执行完dup指令后,操作数栈栈顶一定会 有兩个多多指向该对象实例内存的reference数据,可能性<init>妙招有参数,还前要把参数加载到操作栈。

  JVM完成对象内存的分配及对象初始化并且,会返回对象的地址,如保让压入操作数的栈顶,供后续操作!

  亲戚亲戚大伙看看对应的字节码

  有兩个多多对象前要占用多大的内存?两种 问题报告 其虽然 类加载完成后就可能性选者啦!JVM还前要通过普通java对象的类元信息选者对象大小。为对象分配内存相当与把一块选者大小的内存从java堆中划分出来。没人 问题报告 来了,没人 大的一块堆空间摆在JVM的肩上,JVM该划哪一块空间来分配内存呢?随机找一块空间分配算了?or紧挨着并且分配的空间里边进行分配?这里前要说到的是两种 分配妙招:

  相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8,各人 技术博客www.17coding.info)

  1、 你前要了解的java内存管理机制-运行时数据区

  2、 你前要了解的java内存管理机制-内存分配

  3、 你前要了解的java内存管理机制-垃圾标记

  4、 你前要了解的java内存管理机制-垃圾回收

  2)、 空闲列表

  可能性Java堆一定会 规整的:用过的和空闲的内存相互交错。前要维护有兩个多多列表,记录哪些地方内存可用。分配内存时查表找到有兩个多多足够大的内存,并更新列表,两种 分配妙招称为"空闲列表"(Free List)。例如下图,好好的一块内存被绿得乱七八糟,用里边指针碰撞的妙招是碰不动了!有些有些就用有兩个多多小本本记着哪里有多大的空闲空间还前要绿!当然下图的地址编号是虚拟的,空闲列表的样子也是我意淫出来的,表达的意思你懂就行! 

      

  2)、可能性没人定位到,或没人 检查到,就先执行相应的类加载过程;

  JVM遇到new指令时,先检查指令参数(里边字节码中的#2)是是不是能在常量池中定位到有兩个多多类的符号引用(里边最终定位到常量池中的com/test/entity/People):

  1)、可能性能定位到,检查两种 符号引用代表的类是是不是已被加载、解析和初始化过;

  2)、 本地线程分配缓冲区:把分配的内存按照不同的线程划分在不同的空间进行,每个线程在java堆区预先分配一小块内存,称为本地线程分配缓冲区(Thread Local Allocation Buffer)。哪个线程前要分配就从哪个线程的TLAB上分配,没人在TLAB用完前要分配新的TLAB的并且才前要做同步处理(通过上有些中的CAS机制)。

  引用类型变量中存储有些有些在堆中分配的对象实例数据的地址。

      

  句柄池的妙招会在句柄池中存放类型对象的相关信息,而直接访问的妙招会把类型对象的信息贴到 实例对象的对象头中(亲戚亲戚大伙知道对象头中有 “指向对象类型数据的指针”,虽然 这并一定会 前要的,亲戚亲戚大伙常用的HotSpot虚拟机采用的是直接指针的妙招,有些有些对象头中会中有 “指向对象类型数据的指针”,可能性某类虚拟机采用的是句柄的妙招访问对象,那可能性就不前要在头部存储两种 指针了)。这两种 妙招都互有优缺点:

  内存分配并且,就前要初始化实例对象了,虚拟机前要将分配到的内存空间中的数据类型都初始化为零值(不包括对象头,可能性是使用TLAB,初始化0值的操作提前至分配TLAB时)。接下来虚拟机要对对象进行必要的设置,例如两种 对象是哪个类的实例、如保都还都可以找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息,哪些地方地方信息都存贴到 对象的对象头中。做完以上并且,从虚拟机视角来看,有兩个多多新的对象可能性产生了!

  JVM在堆区划分一块内存作为句柄池,引用类型变量中存储有些有些对象的句柄地址。对象句柄包中有 兩个多多地址(如下图):

  1、在堆中分配的对象实例数据的地址。

  2、两种 对象类型数据地址。

      

  1)、 句柄妙招访问对象时,多一次指针定位的时间开销。如保让对象移动时(垃圾回收时常见的动作),栈上的变量的引用不前要修改,只需改变句柄中实例数据指针。

  2)、 直接指针对象相对句柄妙招访问节省了一次指针定位的时间开销,性能更好。可能性对象访问非常频繁,提升会更明显!如保让在对象移动时,栈上的变量的引用也前要变化。

  1)、 同步处理:JVM采用CAS(Compare and Swap)机制打上去失败重试的妙招,保证更新操作的原子性。CAS机制是两种 轻量级锁机制,后续在聊线程的并且再讲!

  咱们到了适婚年龄,也就该找个对象了吧!你看上了有兩个多多姑娘,长得楚楚动人,就跑去跟他妈说:“我你还都可以有兩个多多对象,把你女儿嫁给我吧!”。她妈妈倒是十分爽快:“好啊,我女儿总得有个地方住吧,小伙子你有房吗?”。这并且场面一度十分尴尬,心里嘀咕着“有些有些国家能分配房子就好了!”。这在当前社会显然不现实,毕竟咱们还没进入共产主义社会!然而在JVM王国里,对象住的“房子”却是“国家”统一分配的。国家集中圈了一大块“地”,谁家要娶“媳妇”,就给俺家 分配一块“地”,“媳妇”胖点呢,地就大有些,“媳妇”瘦有些呢,“地”就小有些。在这里,你有兩个多多人还前要一齐拥有多个对象,在这里,多各人 还前要拥有同有兩个多多对象。有些有些这里的老百姓安居乐业、这里一片祥和……当然,可能性这块“地”大小有限,而你又一齐拥有有些有些对象,还有各人 也要娶对象,有些有些哪些地方地方不想了的对象的“地”国家就会进行统一征收(当然这里不想给补贴,毕竟是免费分配的~)以继续分给各人 用。

  里边扯了没人 多,相信你可能性知道“你”就代表着有兩个多线程,“国家”指的是JVM,“国家”圈的一块“地”有些有些堆空间,你娶的“对象”有些有些实例对象,“国家”分配地的动作有些有些内存分配,而国家征收的动作有些有些垃圾回收。

  另有兩个多多的代码亲戚亲戚大伙有些有些有些会陌生,亲戚亲戚大伙都知道使用new关键字还前要创建有兩个多多对象,对应的字节码如下

  

  具体类的加载、解析、初始化的过程亲戚亲戚大伙还前要去查找JVM类加载机制相关资料,这里就不展开啦!亲戚亲戚大伙前要知道的是两种 步保证了在妙招区中,存在要创建实例对象的类对象

  astore依然前要弹出栈顶值,如保让存储到编号为1的变量中供后续使用。至此有兩个多多删改的对象可能性创建且返回对象内存引用给本地变量存储了。

  dup命令没猜错语句是duplicate的简写。在讨论dup命令前,亲戚亲戚大伙先看有兩个多多简单的例子

  亲戚亲戚大伙能看后,由于 这两种 妙招的差异主要取决于java堆是是不是规整,而java堆是是不是规整又是由jvm采用的垃圾分类分类整理器是是不是中有 压缩功能决定的。使用Serial、ParNew等带Compact过程的分类分类整理器时,JVM采用指针碰撞妙招分配内存。而使用CMS两种 基于标记-清除(Mark-Sweep)算法的分类分类整理器时,采用空闲列表妙招。(下篇文章会具体介绍不同的垃圾分类分类整理器)

  不管是指针碰撞还是空闲列表,一定会存在同有兩个多多问题报告 ,那有些有些在线程的场景下的线程安全问题报告 。多个线程一齐在new的并且把对象分配到同一块内存了该为什办,不得干起来么!于是jvm采用了两种 方案来处理:

  可能性要找对象的人不想 了,有些有些分配的操作也很频繁,没人 摆在“国家”的问题报告 就来了:为什合理分配?为什最大限度的提高空间利用率?为什提高分配下行速率 单位?不想了的空间为什回收?为什知道哪些地方空间不想了?里边有些有些问题报告 都前要结合里边的垃圾回收相关的内容来讨论,这里只讨论分配内存的妙招。

  咦!一看字节码才知道,亲戚亲戚大伙的一行new的代码,对应的字节码另有兩个多多要做没人 多操作!亲戚亲戚大伙逐一来分析一下。

  在上一篇文章中,亲戚亲戚大伙花了较大的篇幅去介绍了JVM的运行时数据区,如保让重点介绍了栈区的社会形态及作用,相关内容请猛戳!在本文中,亲戚亲戚大伙将主要介绍对象的创建过程及在堆中的分配妙招。

  亲戚亲戚大伙里边可能性把对象创建的问题报告 处理了,一齐亲戚亲戚大伙也都知道,引用类型的变量存储的是**对象的引用**!那两种 引用类型数据为什定位到堆中的对象呢?目前主流的对象访问妙招有两种 :

猜你喜欢

uu快3规则_ 网络流行语:在哪里摔倒,就在哪里倒下,再站起来。

【生活百科网】 首页生活小常识生活小窍门uu快3规则健康小常识健康饮食养生保健小偏方低碳生活运动健身急救常识热门搜索:健康常识问答女性废物利用生活常识问答

2020-02-20

2分时时彩交流群_姚晨买了孕妇枕 却被小土豆霸占

8月17日中午,怀孕7个多月的姚2分时时彩交流群晨晒出一组微博照片,照片中儿子躺在孕妇抱2分时时彩交流群枕顶端,舒服的样子十分可爱。姚晨微博表示:“买了个孕妇抱枕,结果土豆最喜

2020-02-20

好运飞艇输钱_解决空间干扰难题 博诣定义开放式办公新体验

中国北京,8月9日讯。日前,缤特力公司(纽交所代码:好运飞艇输钱PLT)(即Poly“博诣”)好运飞艇输钱在全球范围内针对开放式办公空间好运飞艇输钱的生态现状及困扰应对开展研究

2020-02-20

极速五分快三APP下载_令计划、周永康等“老虎”的儿子们惹过哪些祸

 近日,中纪委网站刊发《这10件事千万要操操心,并非 "护犊子"》,其中列举了10件事,提醒广大领导干部操操心、留留神,没人“护犊子”。落马官员中,可是我我我 违法违纪行为

2020-02-20

3分快3注册_Counterpoint报告出炉:一加斩获2018全年印度高端手机市场销量第一

1月400日,市场调研机构Counterpo3分快3注册int发布了2018年印度高端智能手机市场报告。数据显示,受益于持续的强势市场表现,一加成为2018年印度高端手机市场销

2020-02-20