Java中类加载的过程】的更多相关文章

类加载过程 这里的加载过程是严格按照加载开始顺序进行的,注意是加载开始而不是加载完成.也就是有可能会有两个或几个阶段是同时进行的. 比如下面提到的验证过程中的符号引用验证是在解析阶段开始之后进行. 加载(loading): (1).通过一个类的全限定名来获取定义此类的二进制字节流. (2).将这个字节流所代表的静态存储结构转化为方法去运行时数据结构. (3).在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类各种数据的访问入口 连接(linking): 1.验证(v…
jar 运行过程和类加载机制有关,而类加载机制又和我们自定义的类加载器有关,现在我们先来了解一下双亲委派模式. java 中类加载器分为三个: BootstrapClassLoader 负责加载 ${JAVA_HOME}/jre/lib 部分 jar 包 ExtClassLoader 加载 ${JAVA_HOME}/jre/lib/ext 下面的 jar 包 AppClassLoader 加载用户自定义 -classpath 或者 Jar 包的 Class-Path 定义的第三方包 类的生命周期…
1.ClassLoader Java中类加载出现在哪个阶段,编译期和运行期? 类加载和类装载是一样的吗? :当然是运行期间啊,我自己有个理解误区,改正后如下:编译期间编译器是不去加载类的,只负责编译而已,去rt.jar拿数据干嘛,不依然是class文件,jvm是只要是class文件就能运行. 2.类加载ClassLoader,各个类加载器执行顺序是什么? :永远是自己写的加载器先去加载,记住并不是真正的加载,而是双亲委派机制,每个加载器都不真正去加载,而是去让父加载器去加载,想一下,自然界亦是如…
未涉及虚拟机 0.<init>与<clinit>的区别 1.类的加载过程 2.类的使用方式 3.类的加载来源 4.重载之泛型参数不同可以吗 5.参考 引子 记得上次中秋一哥们写个需求,没写完.他中秋过后还请一天假,有点错,打电话叫我帮他继续搞. 由于测试支撑,叫到我加班了.第二天过来看,打开页面直接报错,再次点击报错就不一样了.前次报错是有代码行的,第二次直接页面说类发现什么的错. 看了下代码,类似如下: package san; import java.io.FileNotFou…
类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在.如果有,就直接使用:如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内 4, 加载静态内容: 4.1.把.class中的所有静态内容加载到方法区下的静态区域内 4.2.静态内容加载完成之后,对所有的静态变量进行默认初始化 4.3.所有的静态变量默认初始化完成…
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过. 2.为新生对象分配内存 对象所需内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来.划分的方法主要有两种: a.指针碰撞 如果java堆中内存是绝对规整的,所有用过的内存都放在一边,未使用的内存放在另一…
java虚拟机规范虽然没有强制性约束在什么时候开始类加载过程,但是对于类的初始化,虚拟机规范则严格规定了有且只有四种情况必须立即对类进行初始化,遇到new.getStatic.putStatic或invokeStatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化.生成这4条指令最常见的java代码场景是: 1)使用new关键字实例化对象 2)读取一个类的静态字段(被final修饰.已在编译期把结果放在常量池的静态字段除外) 3)设置一个类的静态字段(被final修饰.已在编…
类加载机制: jvm把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成jvm可以直接使用的java类型的过程. (1)加载 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口. (2)链接 将java类的二进制代码合并到jvm的运行状态之中的过程 2.1 验证 确保加载的类信息符合jvm规范,没有安全方面的问题. 2.2 准备 正式为类变量(static…
我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型. 其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术. 在谈具体的反射技术之前,我想先回顾下,有关类的加载的一些基本的性质和原理,以方便我们更好地理解,反射的作用和特点.…
Java为对象初始化提供了多种选项. 当new一个对象的时候,对象初始化开始: 1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时, 静态字段默认初始化 声明为static的静态字段会被初始化为默认值:数字为0,布尔值为false,对象为null 静态字段显式初始化 如果statis字段有显式赋值,就执行显式初始化 静态代码块 静态代码块可以有任意多个,它们的执行顺序就是在类中声明的顺序 2.类加载完毕,然后以下代码(每次new对象…
知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.com/xdp-gacl/p/3635948.html (1)代码例子 //动物public class Animal{ public String name;//名称 public int age;//年龄 public Animal(){ this.age=100; System.out.prin…
问题:请讲下java的类加载机制及过程 分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗: 回答要点: 主要从以下几点去考虑, 1.类加载的过程? 2.类加载的机制? 3.如何打破双亲委托模型? 在运行java程序时,一个类必须要加载到内存中才可以被使用,那么这个加载的过程是什么样子的那 类加载的过程分为下面三个阶段 加载 所谓加载,就是把字节码文件(java编译器会把源文件编译为字节码文件)加载到JVM中,并且映射为JVM可以识…
Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问到了动态绑定的实现, 然后...就真的没有然后了. 痛定思痛, 在<Core Java>找到了相关的章节,也算是对动态绑定的实现有了一个大概的了解. 对象是Java中最重要的概念, 弄清楚对象方法的调用执行过程会对Java对象有更深层了理解.下面是<Core Java>中对调用过程的详…
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就会得到一条出错信息,因为java会严格检查方法内部局部变量的初始化,正如<java编程思想>中所说“未初始化的局部变量更有可能是程序员的疏忽” 但是对于类内部的字段,java并不会严格检查字段是否初始化,因为类的每一个基本数据类型成员都保证会有一个初始值,哪怕构造器什么都没做. 其实一个对象的初始…
锁的本质 我们先来讨论锁的出现是为了解决什么问题,锁要保证的事情其实很好理解,同一件事(一个代码块)在同一时刻只能由一个人(线程)操作. 这里所说的锁为排他锁,暂不考虑读写锁的情况 我们在这里打个比方,假设有10个人要过独木桥(独木桥只能承载一个人的重量),他们可以排好队一个一个的过,后面一个人看到前面过去了之后他便跟着过去,直到所有的人都过去. 那如果我们用计算机模拟这个过程呢,没错,我们的程序不会排好队,更不会有看到前面的人已经通过这种主观能动性.所以这有点类似于所有的人都是蒙着眼睛的,但他…
所有人都知道面向对象思想,Java中的对象的创建在内存中是如何创建的,传智播客的视频看了一遍,把一些讲解的比较清晰的内容记录下来,方便记忆的更加深刻,Java中创建对象的过程,首先要理解JVM中栈.堆.方法区的空间,以及在这三个空间内,虚拟机都进行什么操作,这样就会理解起来容易一些,其实Java是在C语言的基础上发展起来的,很多的内容是借鉴C语言的. 以下分别是创建一个对象.两个对象.以及三个对象的内存图解,讲的比较详细,而且比较生动,很好理解: (方法调用是在栈中进行的,当方法调用完成之后,会…
在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口. 类加载器(class loader)是 Java中的一个很重要的概念.Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代…
JVM把class文件加载到内存,并对数据进行校验.解析和初始化,最终形成JVM可以直接使用的Java类型的过程. 类加载的过程主要分为三个部分: 加载 链接 初始化 而链接又可以细分为三个小部分: 验证 准备 解析 1.加载 简单来说,加载指的是把class字节码文件从各个来源通过类加载器装载入内存中. 将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口. (2)链接…
一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译与运行.编译即将Java文件通过Javac命令生成.class文件的过程,运行就是将.class文件交给JVM进行执行. 类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程.JVM在执行某段代码时,遇到了class A,然而此时内存中并没有class A的相关信息,于是JVM就会到相应的class文件中去寻找class A的类信息,并加载进内存中,这就是类加载过程. 因此,JV…
每个类编译后产生一个Class对象,存储在.class文件中,JVM使用类加载器(Class Loader)来加载类的字节码文件(.class),类加载器实质上是一条类加载器链,一般的,我们只会用到一个原生的类加载器AppClassLoader,它只加载Java API等可信类,通常只是在本地磁盘中加载,这些类一般就够我们使用了.如果我们需要从远程网络或数据库中下载.class字节码文件,那就需要我们来挂载额外的类加载器. 一般来说,类加载器是按照树形的层次结构组织的,每个加载器都有一个父类加载…
类加载的过程 ------------------------------------------------------- 0.如下图所示JVM类加载机制分为5个部分:加载.验证.准备.解析.初始化,下面来看看这五个过程. 1.将类加载进JVM 加载是类加载过程的第一个阶段,这个阶段在内存中生成一个代表这个类的java.lang.Class对象,作为这个类各种数据的入口.注意这里不一定一定要从.Class文件获取,这里既可以从ZIP包获取(比如从jar包和war包中读取),也可以在运行时计算生…
Java中new一个对象的步骤: 1. 当虚拟机遇到一条new指令时候,首先去检查这个指令的参数是否能 在常量池中能否定位到一个类的符号引用 (即类的带路径全名),并且检查这个符号引用代表的类是否已被加载.解析和初始化过,即验证是否是第一次使用该类.如果没有(不是第一次使用),那必须先执行相应的类加载过程(class.forname()). 2. 在类加载检查通过后,接下来虚拟机将 为新生的对象分配内存 .对象所需的内存的大小在类加载完成后便可以完全确定,为对象分配空间的任务等同于把一块确定大小…
摘要:很多时候提到类加载,大家总是没法马上回忆起顺序,这篇文章会用一个例子为你把类加载的诸多问题一次性澄清. 本文分享自华为云社区<用1个例子加5个问题,一次性搞清java中的类加载问题[奔跑吧!JAVA]>,原文作者:breakDraw . 很多时候提到类加载,大家总是没法马上回忆起顺序,这篇文章会用一个例子为你把类加载的诸多问题一次性澄清. Java类的加载顺序 引用1个网上的经典例子,并做稍许改动,以便大家更好地理解. 原例子引用自:https://blog.csdn.net/zfx20…
序言 联系我上次写的关于Java内存的文章,对象访问在 Java 语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会却涉及 Java 栈.Java 堆.方法区这三个最重要内存区域之间的关联关系,如下面的这句代码: Object obj = new Object(): 1.假设这句代码出现在方法体中,那"Object obj"这部分的语义将会反映到Java 栈的本地变量表中,作为一个 reference 类型数据出现. 2.而"new Object()"这…
来源于:[http://bluepopopo.iteye.com/blog/486548] 什么是writeObject 和readObject?可定制的序列化过程 这篇文章很直接,简单易懂.尝试着翻译一下 ,原文是What are writeObject and readObject? Customizing the serialization process.  在Java中使用Serialization相当简单.如果你有一些对象想要进行序列化,你只需实现Serializable接口.然后,…
以前面试的时候,很多公司的笔试题中有关new一个对象有关一系列初始化的过程的选择题目.请看下面的题目. class Parent { static { System.out.println("---static Parnet---"); } public Parent() { System.out.println("----Parent----"); } } class Child extends Parent { static Other other = new…
本文为在公司内部TD上写的一篇小文, 主要讲解java中classLoader基础知识, 现在拿来这里分享一下. 一.问题 请在Eclipse中新建如下类,并运行它: 1 package java.lang; 2 3 public class Long { 4 public static void main(String[] args) { 5 System.out.println("Hi, i am here"); 6 } 7 } 你能猜到它的运行如果吗? 不错,就是如下这个样子!…
转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制   我们知道,Java是一种动态语言.那么怎样理解这个"动态"呢?或者说一门语言具备了什么特性,才能称之为动态语言呢?对于java,我是这样理解的. 我们都知道JVM(java虚拟机)执行的不是本地机器码指令,而是执行一种称之为字节码的指令(存在于class文件中).这就要求虚拟机在真正执行字节码之前,先把相关的class文件加载到…
顺序控制语句1 goto建议不要使用 declare i number:=; begin loop dbms_output.put_line(i); then goto end_loop; end if; i:=i+; end loop; <<end_loop>> dbms_output.put_line('循环结束'): end; 2 null语句null语句不会执行任何操作,提高程序的可读性 ...... if ..then ... else null end if; ....…
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+javalobby%2Ffrontpage+%28Javalobby+%2F+Java+Zone%29&utm_content= 我们这里把问题简化方便分析. 属性.方法.构造方法和自由块都…