类加载过程&对象的创建过程】的更多相关文章

类加载过程 1.JVM发现要使用一个类,首先要到方法区中找:如果找到了,就直接使用,如果没有找到,才会去找这个类的class文件,然后加载: (在找class文件时,是根据classpath配置的地址去找:如果没有配置,就在当前目录找) 2.在硬盘上找到class文件后,就开始加载这个class,根据书写顺序,先后将静态成员加载到静态区域,非静态成员加载到非静态区域: 3.接下来为所有的静态成员变量分配变量空间,同时赋默认值: 4.接下来根据书写的顺序为静态成员变量显示赋值,同时执行静态代码块:…
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV…
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是否能在常量池中找到一个符号引用 2 如果找到符号引用,就检查这个符号引用是否已经被加载,解析和初始化过 3 如果没有加载过,则执行类加载过程 4 为对象分配内存(对象所需的内存在类加载的时候就可以确定) 指针碰撞法 : 假设java堆中的内存是规整的,所有用过的内存放在一边,空闲的内存放在另一边中间…
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程. 版权声明: 本文原创作者:书呆子Rico 作者博客地址:http://blog.cs…
简要说明的话,Java对象的创建过程分为下面几步: 1.执行相关检查: 2.为对象分配内存,将分配到的内存空间都初始化为零值: 3.进行构造代码块和构造函数的初始化 下面详细介绍这几个步骤: 1.执行相关检查 虚拟机遇到一条new指令时,将会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载.解析和初试化过,如果没有,那必须先执行相应的类加载过程: 例:Person p = new Person() 当有这么一条new指令时,我们先去检查p这个符号…
参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化.在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化.本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机…
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象,这种方式在Java规范中被称为 : 由执行类实例创建表达式而引起的对象创建.除此之外,我们还可以使用反射机制(Class类的newInstance方法.使用Constructor类的newInstance方法).使用Clone方法.使用反序列化等方式创建对象. 1). 使用new关键字创建对象 这…
JVM中对象的创建过程如以下流程图中所示: 对其主要步骤进行详细阐述: 为新生对象分配内存: 内存的分配方式: 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存放在一边,空闲的内存在另一边,中间放着一个指针作为分界的指示器,那么当分配内存时仅需移动指针即可. 空闲列表:维护一个列表,记录那些内存可用,分配时找出一块足够大的空间进行划分,并更新列表记录. 选择:分配方式的选择依赖于内存大小是否规整,内存大小的规整,依赖于垃圾收集器是否带有压缩整理功能. 并发情况下保证线程安全: 方法一:…
上一篇的介绍中, 并没有介绍到对象的创建过程, 这一篇主要就介绍一下, 对象的创建过程. 其实熟悉了IL语法之后, 完全可以用Reflector反编译代码去查看. 而且正因为有这个工具, 可以对照着Reflecotr中的IL代码去写Emit的IL. 好了, 开始正题了, 还是从实例开始: 一.示例 首先建类(Person, Contacts): public class Person { public string Name { get; set; } public int Age { get;…
总结一下对象的创建过程,假设有一个名为Dog的类: 1. 即使没有显示地使用static关键字,构造器实际上也是静态的方法,因此,当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,java解释器必须查找类的路径,以定位Dog.class文件. 2. 然后载入Dog.class(后面会学到,这将创建一个Class对象),有关静态初始化的所有动作都会执行.因此,静态初始化只在Class对象首次加载的时候进行一次. 3. 当用new Dog()创建对…
public class Test1 { public static void main(String[] args) { new B(); System.out.println("------------"); new B(); B b=new B(); System.out.println(b.v5); } } class A{ int v1=1; int v5=5; static int v2=2; static{ System.out.println("A的静态块&q…
1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下面分步骤详细讲解 A: 虚拟机为对象分配内存方式 1. 指针碰撞: 堆内存规整时,这时就可以把其看做一半连续内存被占用,一半连续的内存空闲.所以当创建新对象时,从空闲的内存中分配空间给新对象 2.空闲列表: 堆内存是不连续的,这就需要虚拟机维护一个内存列表,用于记录当前内存是否被占用,当新创建对象时…
一.对象的创建过程 1.首次创建对象时或该类静态方法/静态域首次被访问时,JAVA解释器查找该类的路径,定位该类的class文件 2.载入该类的class文件,有关静态初始化的所有动作执行,但是只执行一次. 3.当用new方法创建对象时,在堆上为对象分配足够的存储空间 4.清零分类的存储空间使该类的基本类型设置成为默认值,引用为null 5.执行所有出现于字段定义出的初始化动作 6.执行构造器 注意 初始化顺序是先静态对象后非静态对象,然后构造器初始化. 静态对象初始化只进行一次,(1)在首次生…
最近通过Reflector学习了一下asp.net内部的原理,做做笔记,方便以后查阅. 先看下HttpApplication 对象的创建过程 从IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(context);这里看出,HttpApplication 实例 是通过HttpApplicationFactory创建出来的,但它内部又是怎样操作的呢? 1.在theApplicationFa…
1.对象的创建过程 1.1 . 给对象分配内存 对象的内存分配有两种方式,一种是指针碰撞另外一种是空闲列表的方式,堆是否规整由我们垃圾回收器来决定的 ,如果垃圾回收带有我们的压缩算法,那么他会规整的分配我们的对象. 1.1.1 指针碰撞 我们内存分配为规整的,每次分配依靠指针位移来分配对象,如果在多线程创建对象的情况下是通过在CPU硬件层面上加锁CAS锁来保证数据安全,如图下所示 1.1.2 空闲列表 堆内部有一个列表来存储我们堆中空闲的地方.我们创建对象则去找列表中对应的空闲区域去创建我们的对…
编译指令 :javac Test.java 反编译指令: javap -v Test 代码 public class ObjectTest { int m = 8; public static void main(String[] args) { ObjectTest o = new ObjectTest(); } } 安装jclasslib插件后,可以看到这个类的clazz文件: 如图所示: 这个是 对象的创建过程, 这个过程中有个半初始化状态, 这里的 invokespecial 和 ast…
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到方法区.在类的加载过程中,该类的静态成员变量(static)加载到方法区的静态区域,非静态成员变量加载到方法区的非静态区域.加载静态成员变量时,会根据书写的顺序,将所有的静态成员变量加载到方法区的静态区域.然后给所有的静态成员变量赋默认值,然后,根据静态成员变量的书写位置,给静态成员变量赋显示值.赋…
(Java 普通对象.不包括数组.Class 对象等.) ​ 对象创建过程 类加载 遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化.如果没有就进行类加载. 分配内存 从堆中找到一块空间划分给对象. 分配时,为了避免并发问题,JVM 会通过 CAS + TLAB 来保证线程安全. TLAB 本地线程分配缓冲 每个线程都会在堆中预先分配一小块内存,这块空间叫做 TLAB. 线程每次给对象分配内存,就从它的 TLAB 中划分.用完会再给线程分配新的 TLAB. 只有分…
java 对象创建的过程 存在了继承关系之后,对象创建过程如下: 1.分配空间.要注意的是,分配空间不光是分配子类的空间,子类对象中包含的父类对象所需要的空间,一样在这一步统一分配.在分配的空间的时候,会把所有的属性设置为默认值. 2.递归的构造父类对象. 3.初始化本类属性. 4.调用本类的构造方法. 举例介绍对象创建的过程. 假设如下代码: class A{ ; ; } } class B extends A { ; ; } } public calss TestInherit{ publi…
javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = new Object(); obj.userName = 'ghostwu'; obj.showUserName = function(){ return obj.userName; }; var obj2 = new Object(); obj2.userName = '卫庄'; obj2.sh…
一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() print(MyClass, type(MyClass)) print(myc, type(myc)) 我们创建了一个名为MyClass的类,并实例化了这个类,得到其对象myc 上面代码打印的结果为: <class '__main__.MyClass'> <class 'type'> <…
1.Java运行时数据区 方法区,堆线程共享.虚拟机栈,本地方法栈和程序计数器线程私有. 2.程序计数器(PC计数器) 占用较小的一块内存空间,当执行Java方法时记录正在执行的虚拟机字节码指令地址,如果执行Native方法则计时器值为空. 3.Java虚拟机栈 java方法执行时的内存模型 查看Java虚拟机栈详细 3.1 栈帧 每个方法都会在虚拟机栈中创建一个对应的栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 一个方法的调用到结束就对应这一个栈帧从虚拟机栈入栈到出栈. 4.…
1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创建是非常频繁的,存在并发问题.有两个解决方法: (1)采用CAS配上失败重试的方式保证更新操作的原子性: (2)把内存分配的动作按线程划分在不同的空间中进行,即每个线程在java堆中预先分配一小块内存,称为本地线程分配缓冲TLAB.…
虚拟机会new 指令: 1.检查指令的参数可在对类的符号引用的恒定饮食定位,并检查是否已装上代表这个类的符号引用.分析和初始化.假设没有.您必须运行相应的类加载过程. 2.类加载通过审查,虚拟机将分配一个对象新生.入后便全然确定. 为对象分配空间的任务等同于在一块确定大小的内存从Java堆中划分出来.如堆内存是规整的,用过的在一边,空暇的在还有一边.中间放着指针座位分界点指示器.那分配就是将指针挪动一段,叫"指针碰撞".如不规整,虚拟机必须维护一个列表.记录哪些内存可用,分配完更新&q…
//TODO https://www.cnblogs.com/chenyangyao/p/5296807.html…
一.对象的创建过程 对象的创建过程大致可以分为六步,其中对象的分配尤为重要: 二.对象分配内存 一般来说对象分配内存有两种方式: 第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的:一边是用过的内存,一边是空闲的内存,中间一个指针作为边界指示器:分配内存只需向空闲那边移动指针,这种分配方式称为"指针碰撞"(Bump the Pointer): 第二中方式是空闲列表,这中方式没有指针碰撞那么理想,但是也有他自身的优势:如果Java堆不是规整的:用过的和空闲的内存相互交错…
java对象的创建过程 (1)用new 语句创建对象,这是最常用的创建对象方法. 下面用一个简单的存在继承关系的实例的创建,来叙述对象创建过程中的细节 概括如下: 执行顺序:(优先级从高到低.)静态代码块>main方法>构造代码块>构造方法. 1.静态代码块:    * 在类中方法外出现,并加上static修饰: * 用于给类进行初始化,为类的属性初始化.一般用于加载驱动 * 在类加载的时候就执行,并且只执行一次. * 如果类中包含多个静态代码块,那么将按照"先定义的代码先执行…
有了之前的对进程和线程对象的学习的铺垫后,我们现在可以开始学习windows下的进程创建过程了,我将尝试着从源代码的层次来分析在windows下创建一个进程都要涉及到哪些步骤,都要涉及到哪些数据结构. 1. 相关阅读材料 <windows 内核原理与分析> --- 潘爱民 <深入解析windows操作系统(第4版,中文版)> http://bbs.pediy.com/showthread.php?p=819417#post819417      看雪上的精华贴 http://und…
本文系作者自己学习之所用,文章内容仅出自作者拙劣之思考,问题之处烦请不吝指教. MediaPlayer 能被用来控制音/视频文件或流媒体的回放.Android中以MediaPlayer类作为音视频播放的基础类,围绕着他开展了一系列的处理.学习一个新的模块,最简单的步骤就是找到一个典型的应用程序,通过它的实现,来分析整个模块的数据流和控制流.典型的MediaPlayer在Java处的接口包括视频播放类VideoView以及音频专用MediaPlayer类. 一. 一个简单的视频播放demo app…