看图说说Sun HotSpot虚拟机对象】的更多相关文章

一.对象的创建 1.类加载检查 普通对象的创建过程:虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那么必须先执行相应的类加载过程. 2.分配内存 分配内存时主要注意两个问题:1.如何分配空间.2.修改指针时如何实现线程安全. 如果内存是规整的,就使用“指针碰撞”的方式,即将空闲部分的指针移动对象内存大小相等的距离.如果内存不是规整的,虚拟机必须维护一个表,记录那些内存块可用,然后从…
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE?     Java技术体系包括:         · Java程序设计语言:         · 各种硬件平台上的Java虚拟机:         · Class文件格式:         · Java API类库:         · 来自商业机构或开源社区的第三方Java类库.     JDK,即Java开发工具包,包括Java程序设计语言.Java虚拟机.Java API类库,是用于支持Java程序开发的…
前言 上篇文章介绍了Java虚拟机的运行时数据区域,大致明白了Java虚拟机内存模型的概况,下面就基于实用优先的原则,以最常用的虚拟机HotSpot和最常用的内存区域Java堆为例,升入探讨一下HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 对象的创建 Java是一门面向对象的编程语言,在Java程序的运行过程中每时每刻都有对象被创建出来,那么在虚拟机中,对象的创建是怎样的一个过程呢? 当Java虚拟机遇到一条字节码new指令时,首先检查这个指令的参数是否能定位到一个类的符号引…
学习目的:探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 虚拟机在执行到一条new指令时,先要检查指令的参数(将要实例化的类)是否已经被加载.解析.初始化过,如果已经走过了这3个步骤,就可以直接给新生对象分配内存:如果没有走那就必须先把类加载过程走完才行.(把类看作模板,把对象实例看作产物,没有模板我们怎么得到产物?) 如果GC(垃圾收集器)带有压缩整理功能,那么堆内存就是规整连续的,这时虚拟机采用非常非常简单的“指针碰撞”算法来为对象划出一块内存:如果GC…
以常用的HotSpot和常用的Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程 1.对象的创建 ①虚拟机遇到一条new指令后,首先将去检查这个指令的参数是否能够在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已经被加载.解析和初始化过,如果没有,那必须先进行相应的类加载过程 ②类加载通过后为新生对象分配内存.对象所需的内存在类加载过程中就完全确定下来,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来 这时候会有两个问题,第…
本节以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1. 对象的创建 Java是一门面向对象的编程语言.在语言层面上,创建对象(例如克隆.反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 对象创建过程如下: 1.1 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个…
都知道Java是一门面向对象的编程语言,在Java程序运行过程中,无时无刻不在创建对象,所以这节来总结一下HotSpot虚拟机中的Java对象. 一.Java虚拟机对象的创建过程. 在语义层面创建一个对象就是new的过程,但是在虚拟机里面,对象(这里的对象指的是普通对象,不包括数组和class对象等)又是怎么被创建的呢? 1.当Java虚拟机收到一个new指令时,它首先会去常量池中检查是否存在这个类的符号引用.如果存在则会执行下一步,否则会创建一个符号引用放在常量池中(待考察): 2.当在常量池…
基于使用优先的原则,以常用的虚拟机HotSpot和常用的内存区域Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程. 1.对象的创建 划分可用空间 在语言层面上,创建对象(例如克隆.反序列化)通常仅仅是一个new关键字而已,而在虚拟机中,对象(主要讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样的一个过程呢? 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是…
以常用的HotSpot虚拟机和JAVA内存区域堆为例,探讨对象的创建,对象的内存布局以及对象的访问定位 一.对象的创建 1)类加载:虚拟机遇到一条new指令时,先检测这个指令的参数能否在常量池中定位到一个类的符号的引用,并检查这个符号代表的类否收以及被加载,解析和初始化,如果没有那么就必须执行相应的类加载过程 2)分配内存:如果java堆的内存是绝对规整的,那么采用指针碰撞的方式分配内存,即所有空闲的内存放一边,不空闲的内存放一边,中间放着一个指针作为分界点的指示器,分配内存就仅仅是把那个指针向…
对象的创建 Java 对象的创建过程, ①类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过.解析和初始化过.如果没有,那必须先执行相应的类加载过程. ②分配内存: 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来.分配方式有 “指针碰撞” 和 “空闲列表” 两种,选择那种分…
对象的创建过程 1.加载类 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载. 解析和初始化过. 如果没有,那必须先执行相应的类加载过程. 2.分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存. 对象所需内存的大小在类加载完成后便可完全确定. 为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来. 分配方式: 1.指针碰撞.适用于连续内存,需要垃圾回收有整理功能. 2.空闲列表.不…
一.对象的创建 1.类加载: 虚拟机在遇到一条new指令时候,检查类是否已被加载.解析.初始化过,如果没有,则执行类加载过程. 2.分配内存:类加载完成后,则为新对象从java堆上分配内存,分配内存有两种方式:指针碰撞和空闲列表 指针碰撞 Java堆中内存是绝对完整的,用过和空闲的内存分别放在一边,中间用一个指针作为分界点的指示器.分配内存时就是将指针向空闲内存区域挪动一段与对象同样大小的距离. 空闲列表 Java对中内存不是规整的,用过的和空闲的内存相互交错,这种情况,虚拟机就必须维护一个列表…
对象的创建 java是一门面向对象的语言.在Java程序执行过程中无时无刻有Java对象被创建出来.在语言层面上,创建对象(克隆.反序列化)一般是一个newkeyword而已,而在虚拟机中,对象的创建步骤例如以下: 1.当虚拟机遇到new指令时.首先将去检查这个指令參数能否在常量池中定位到一个类的引用符号,而且检查这个符号引用代表的类是否被载入.解析和初始化过.假设没有.那必须先执行相应的类载入过程. 2.在类载入检查通过以后.接下来虚拟机将为新生对象分配内存.对象所需的内存大小在类载入后便确定…
1.对象创建过程: ①.类加载检查:当java虚拟机遇到一条new指令时,首先会去检查该指令的参数能否在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析.初始化过,如果没有,则必须先执行相应的类加载过程. ②.分配内存:类加载检查完成后,虚拟机将为新对象分配内存空间,且对象所需内存空间大小在其完成类加载检查后即可确定,该过程其实就是在堆中划分一小部分的确定大小的空间,用于存储对象信息.其中分配方式有以下两种: 内存分配的并发问题: 在创建对象时存在线程安全问题,虚拟…
对象的创建 Step1 类加载检查 当发现一条new指令时,检查: 该指令的参数是否能在常量池中定位到一个类的符号引用: 并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. Step2 为新生对象分配内存 对象所需的内存大小在类加载完成之后便可完全确定.分配方式有两种,选择哪种分配方式由java堆是否规整决定:而java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定. 两种分配方式: 指针碰撞(Bump the Pointer): 内存…
对象的内存布局 在 HotSpot 虚拟机中,对象的内存布局分为以下 3 块区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding) 对象头 对象头记录了对象在运行过程中所需要使用的一些数据: 哈希码 GC 分代年龄 锁状态标志 线程持有的锁 偏向线程 ID 偏向时间戳 对象头可能包含类型指针,通过该指针能确定对象属于哪个类.如果对象是一个数组,那么对象头还会包括数组长度. 实例数据 实例数据部分就是成员变量的值,其中包括父类成员变量和本类成员变量. 对…
一.对象的创建过程 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那就先执行相应的类加载过程. 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来,划分方式有指针碰撞和空闲列表两种,划分方式的选择取决于垃圾回收算法是否支持压缩整理功能,因此,在使用Serial.Pa…
1.对象的创建 Java是一门面向对象语言,在运行过程中无时不刻不在创建对象.从语言层面,创建对象仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象仅限于普通java对象,不包含数组和Class对象等)的创建又是怎么样的过程呢? 1.1类加载检查 虚拟机遇到一条new指令的时候,首先将去检查这个指令的参数在常量池中能否定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,则必须先执行对应的类加载过程. 1.2内存分配 在类加载检查通过后,将会为对…
2.3.1对象创建 Java是一门面向对象的语言,在Java程序的运行过程中无时无刻都有新的对象被创建出来.从语言的层面看,创建对象通常仅仅是一个new关键字而已,从虚拟机的角度看,创建对象又是怎样的一个过程呢? 虚拟机遇到一条new指令时,首先将会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,必须想执行相应的类加载过程. 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可…
1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创建是非常频繁的,存在并发问题.有两个解决方法: (1)采用CAS配上失败重试的方式保证更新操作的原子性: (2)把内存分配的动作按线程划分在不同的空间中进行,即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲TLAB.…
参考:http://www.infoq.com/cn/articles/jvm-hotspot…
一.对象的内存布局 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 从上面的这张图里面可以看出,对象在内存中的结构主要包含以下几个部分: Mark Word(标记字段):对象的Mark Word部分占4个字节,其内容是一系列的标记位,比如轻量级锁的标记位,偏向锁标记位等等. Klass Pointer(Class对象指针):Class对象指针的大小也是4个字节,其指向的位置是对象对应的C…
概述: 上一篇文章,介绍了虚拟机类加载的过程,那么类加载好之后,虚拟机下一步该干什么呢.我们知道java是面向对象的编程语言,所以对象可以说是java'的灵魂,这篇文章我们就来介绍 虚拟机是如何创建对象.对象内存分配以及对象是如何使用的(访问定位).由于各个虚拟机的实现不尽相同,所以这里我们以最常用的HotSpot虚拟机为例来介绍. 对象的创建: 对象在虚拟机中创建的步骤如下: 当虚拟机遇到一条字节码new指令时,首先会去检查这个类是否被加载.解析和初始化,如果没有,则执行类加载(类加载步骤这里…
内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种:…
在HotSpot虚拟机中,对象在内存中存储的布局可以被分为3个区域:对象头(Header).实例数据(Instance data)和对齐填充(Padding).对象头包括两部分信息,第一部分存储自身的运行时数据,如哈希值.GC分代年龄.锁状态标志.线程持有的锁.偏向锁ID.偏向时间戳等,这部分数据的长度在32位和64位的虚拟机中(未开启压缩指针)分别为32bit和64bit,官方称它为 Mark Word. 存储内容 标志位 状态 对象哈希码.对象分代年龄 01 未锁定 指向锁记录的指针 00…
在测试服务器上使用如下命令可以查看当前使用的 GC收集器,当然不止这一个命令可以看到,还有其他一些方式 第三列”=”表示第四列是参数的默认值,而”:=” 表明了参数被用户或者JVM赋值了 [csii@devpwcoreapp bin]$ ./java -XX:+PrintFlagsFinal -version | grep : uintx InitialHeapSize := {product} uintx MaxHeapSize := {product} uintx ParallelGCThr…
注:如其中有不懂的名词,下面有名词解释 1.对象的创建(限于普通Java对象,不包括数组和Class对象等) (1)检查这个指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否被加载,解析,初始化,如果没有,先加载 (2)为新生对象在java堆中分配内存,java堆如果规整,分配内存的方法可使用“指针碰撞“,如果不规整,则使用”空闲列表“.选择哪种分配方式是根据这个虚拟机所采用的垃圾收集器是否带有压缩整理功能决定的.例如,在使Serial. ParNew等带Compac…
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内存模型 JVM实现的堆内存和方法区 新生代和老年代. 新生代中的内存划分 由JDK1.7及以前的永久代到JDK1.8的元数据区 参考资料 介绍 初学Java虚拟机几天, 被方法区, 永久代这些混杂的概念搞混了. 我觉得学习这部分知识应该把官方定义的虚拟机运行时数据区域和虚拟机内存结构分开叙述, 要不…
最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”.为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器! 即时编译器并不是虚拟机必须的,但是一个即时编译器编译性能的好坏.代码优化程度的高低确实衡量一款商用虚拟机优秀与否的最关键的指标之一,他要是虚拟机最核心最能体现技术水平的部分. 要解决的问题: ①为何HotSpot虚拟机要使用解释…