类加载

Java类加载机制

送分小仙女□ 提交于 2020-11-06 07:59:38
一、Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 2.工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤: (1) 装载:查找和导入Class文件; (2) 链接:把类的二进制数据合并到JRE中; (a)校验:检查载入Class文件数据的正确性; (b)准备:给类的静态变量分配存储空间; (c)解析:将符号引用转成直接引用; (3) 初始化:对类的静态变量,静态代码块执行初始化操作 Java程序可以动态扩展是由运行期动态加载和动态链接实现的;比如:如果编写一个使用接口的应用程序,可以等到运行时再指定其实际的实现(多态),解析过程有时候还可以在初始化之后执行;比如:动态绑定(多态); 【类初始化】 (1) 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化

Tomcat类加载

泄露秘密 提交于 2020-04-08 10:57:27
一、类加载器实例之——Tomcat 主流的Java Web服务器,如Tomcat、Jetty、WebLogic、WebSphere,都实现了自己定义的类加载器(一般都不止一个)。因为一个功能健全的Web服务器,要解决如下问题: 部署在同一个服务器上的两个Web应用程序所使用的Java类库可以使用相互隔离。 这是最基本的要求,因为不同应用可能依赖同一个类库的不同版本,不能要求每个类库在一个服务器只有一个版本,应当保证两个应用程序的类库可以互相独立使用 部署在同一个服务器上的两个Web应用程序所使用的Java类库可以互相共享。 这个也很正常,比如我有10个应用程序,都用到Spring,那么我不可能放10份Spring相关的类库吧。 服务器需要尽可能地保证自身的安全不受部署的Web应用程序影响。目前很多Java Web服务器也是Java实现的,因此肯定有库依赖问题。一般来说,基于安全考虑,服务器所使用的类库应该和应用程序的类库相互独立 支持Jsp应用的Web服务器,十有八九都需要支持HotSwap功能。因为Jsp本质上还是需要被编译成.class文件才能被JVM执行,但Jsp在运行时被修改的概率比较大。因此主流Web服务器都会支持Jsp生成类的热替换 由于以上几个要求,如果只有一个CLASSPATH就很难实现了。 所以各种Web服务器都会提供好几个CLASSPATH路径供用

类加载器ClassLoader-2

南楼画角 提交于 2020-04-07 04:13:27
类装载器 大纲: n class装载验证流程 n 什么是类装载器ClassLoader n JDK中ClassLoader默认设计模式 n 打破常规模式 n 热替换 class装载验证流程: n 加载 n 链接 – 验证 – 准备 – 解析 n 初始化 加载 n 装载类的第一个阶段 n 取得类的二进制流 [z1] n 转为方法区数据结构 n 在 Java 堆中生成对应的 java.lang.Class 对象 链接 验证 n 链接 -> 验证 – 目的: 保证 Class 流的格式是正确的 文件格式的验证 n 是否以 0xCAFEBABE 开头 n 版本号是否合理 元数据验证 n 是否有父类 n 继承了 final 类? n 非抽象类实现了所有的抽象方法 1, 什么是元数据: 举例: 任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据 ,而 元数据指用来描述一个文件的特征的系统数据 , 诸如访问权限、文件拥有者以及文件数据块的分布信息 (inode...) 等等。 在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。 用户需要操作一个文件必须首先得到它的元数据 , 才能定位到文件的位置并且得到文件的内容或相关属性。 2, 元数据最大的好处是 , 它使信息的描述和分类可以实现格式化 , 从而为机器处理创造了可能。 3, 元数据概念:

从读取properties文件说开去,浅谈web容器中类加载器

你离开我真会死。 提交于 2019-12-07 16:28:24
今天刚好有人让我写个通过读取properties连接数据库的小demo. 汗啊,普通项目中可以使用的文件读取,在web项目中总报空指针异常. 查阅了资料明白,赶紧记录下来,希望遇到此类问题的童鞋能引起重视。 废话不说,直接进入主题! 代码清单1: import java.io.InputStream; import java.util.Properties; import org.apache.log4j.Logger; /** * * 项目名称 PropertiesDemo * 包 名 com.linfeng.util * 文 件 名 PropertiesUtil.java * 开 发 人 Administrator * 描述信息 Properties文件读取类 * 发布日期 2012-10-31上午11:34:59 * 修改日期 * 修 改 人 * 版本信息 V1.0 * */ public class PropertiesUtil { private static Logger log = Logger.getLogger(PropertiesUtil.class); private Properties propertie; private InputStream inputFile; public PropertiesUtil(String filePath){

一个JDBC驱动注册死锁问题总结

僤鯓⒐⒋嵵緔 提交于 2019-12-07 04:18:28
群里有个大神(你假笨)再讲解工作中碰到的一个死锁问题. 这个是大神后来总结的文章: http://lovestblog.cn/blog/2014/07/08/jdk-sql-deadlock/ 情况是这样的: 项目碰到多线程初始化JDBC驱动时,产生死锁,如下实例所示: (我的环境: JDK1.7.0_45, msql_jdbc:mysql-connector-java-5.1.29) public class Temp { public static void main(String[] args) throws Exception { Thread a = new Thread(new ThreadA()); Thread b= new Thread(new ThreadB()); a.start(); b.start(); } } class ThreadA implements Runnable{ @Override public void run() { try { Class.forName("com.mysql.jdbc.Driver", true, Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } }

类加载器ClassLoader-1

老子叫甜甜 提交于 2019-11-30 01:11:45
一, 类加载器深入剖析 1,Java虚拟机与程序的生命周期 在如下几种情况下,Java虚拟机将结束生命周期: –执行了System.exit()方法 –程序正常执行结束 –程序在执行过程中遇到了异常或错误而异常终止 –由于操作系统出现错误而导致Java虚拟机进程终止 2,类的加载,链接,初始化 概念: •加载:查找并加载类的二进制数据(java编译后的.class文件) •连接 –验证:确保被加载的类的正确性 –准备:为类的静态变量分配内存,并将其初始化为默认值 –解析:把类中的符号引用转换为直接引用 •初始化:为类的静态变量赋予正确的初始值(=号后面的值) 图示: 初始化的条件: •Java程序对类的使用方式可分为两种 –主动使用 –被动使用 •所有的Java虚拟机实现必须在每个类或接口被Java程序“首次主动使用”时才初始化他们 •主动使用(六种) –创建类的实例 –访问某个类或接口的静态变量,或者对该静态变量赋值 –调用类的静态方法 –反射(如Class.forName(“com.shengsiyuan.Test”)) –初始化一个类的子类 –Java虚拟机启动时被标明为启动类的类(Java Test),就是用java命令执行的那个带有main方法入口的类。 被动使用 除了以上六种情况,其他使用Java类的方式都被看作是对类的被动使用,都不会导致类的初始化。 类的加载: 1

Java类加载及变量初始化过程

房东的猫 提交于 2019-11-28 22:15:06
Java 虚拟机如何把编译好的 .class 文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就是解决上面 3 个问题的。 本文前面理论部分比较枯燥,但是如果耐心读完,结合后面的实例,我相信你以后绝对不会再遇到java类初始化这样的疑惑。 若有不正之处,请多多谅解并欢迎 各位能够给予 批评指正 , 提前谢谢各位 。 1. Java 虚拟机加载 .class 过程 虚拟机把 Class 文件加载到内存,然后进行校验,解析和初始化,最终形成 java 类型,这就是虚拟机的类加载机制。加载,验证,准备,初始化这 5 个阶段的顺序是确定的,类的加载过程,必须按照这种顺序开始。这些阶段通常是相互交叉和混合进行的。解析阶段在某些情况下,可以在初始化阶段之后再开始 --- 为了支持 java 语言的运行时绑定。 Java 虚拟机规范中,没有强制约束什么时候要开始加载,但是,却严格规定了几种情况必须进行初始化(加载,验证,准备则需要在初始化之前开始): 1 )遇到 new 、 getstatic 、 putstatic 、或者 invokestatic 这 4 条字节码指令,如果没有类没有进行过初始化,则出发初始化 2 )使用 java.lang.reflect 包的方法,对垒进行反射调用的时候,如果没有初始化,则先触发初始化