- 浏览: 539505 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (233)
- 设计模式 (1)
- WEBLOGIC (2)
- spring (2)
- struts (1)
- hibernate (8)
- SOA (11)
- j2ee (0)
- corba (0)
- linux (2)
- oracle (0)
- webService (17)
- javaMail (1)
- junit (3)
- java (45)
- 正则表达式 (7)
- java+xml (4)
- html (2)
- javaScript (6)
- ajax (1)
- mysql (0)
- eclipse (2)
- eclipse插件开发 (3)
- 软件工程 (5)
- ant (6)
- 开源包 (6)
- 学习网站 (7)
- Struts2 (18)
- JSP (1)
- 持续集成 (4)
- FreeMaker (6)
- 工作项目点点 (4)
- Maven2 (6)
- JQuery (1)
- 日志记录 (9)
- 工作流 (4)
- BPEL (1)
- extJs (1)
- 组件 (1)
- OSGI (10)
- ESB总线学习 (1)
- 错误解决 (2)
- JMX (3)
- 网络知识 (1)
最新评论
-
duanlongk:
这个问题解决了么?
java.lang.NoClassDefFoundError: org/apache/tuscany -
sotrip:
从上面结果来看,HelloWorld.class是由虚拟机的内 ...
如何实现自己的classloader -
zengsir2008:
哎,不太明白。。。。
OSGI DS 实例 -
ralfsumahe:
...
使用XFire开发Web Service客户端完整入门教程 -
liuqiao_0702:
...
osgi spring hibernate =
Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。
这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader
和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中AppClassLoader在很多地方被叫做System ClassLoader
Bootstrap ClassLoader是在JVM开始运行的时候加载java的核心类,是用C++编写的,它用来加载核心类库,在JVM源代码中这样写道:
static const char classpathFormat[] =
"%/lib/rt.jar:"
"%/lib/i18n.jar:"
"%/lib/sunrsasign.jar:"
"%/lib/jsse.jar:"
"%/lib/jce.jar:"
"%/lib/charsets.jar:"
"%/classes";
Extension ClassLoader是用来加载扩展类,即/lib/ext中的类。
AppClassLoader用来加载Classpath的类,是和我们关系最密切的类。
URLClassLoader用来加载网络上远程的类,暂且不讨论。
它们之间的关系:
1.Parent-Child,按顺序从大到小。不是简单的继承关系。
2.ClassLoader有个getParent的方法,但是Ext ClassLoader调用后得到的是null,bootstrap是JVM自己的,用户看不到。
3.classloader的委托机制:当等级比较低的ClassLoader要加载某个类的时候,它首先会请求Parent加载器来加载,Parent再请求它的Parent
比如现在Ext要加载了,它往上请求。如果最大的Bootstrap找不到,那么Boot会叫Ext自己找找,Ext找不到,是不会让下一级的App去找的,此时就报出ClassNotFoundException
4.类A调用类B,B会要求调用它的类的类加载器来加载它,也就是B会要求加载A的加载器来加载B。这就会有个问题,如果他们在一起,那没关系,肯定某个classloader会把它们俩都加载好。但是如果A在/lib/ext文件夹中,而B在Classpath中呢?过程是这样的首先加载A,那么一层层上到Bootstrap Classloader,boot没找到所以ext自己找,找到了,没问题;加载B,因为A调用了B,所以也从bootstrap来找,没找到,然后A的ext classloader来找还是没找到,但是再也不会往下调用了,于是报出ClassNotFoundException。
但是现实生活中有很多应用,比如JDBC核心方法在核心库而驱动在扩展库,是必定在两个地方的,那怎么办呢?要用到Context ClassLoader我们在建立一个线程Thread的时候,可以为这个线程通过setContextClassLoader方法来指定一个合适的classloader作为这个线程的context classloader,当此线程运行的时候,我们可以通过getContextClassLoader方法来获得此context classloader,就可以用它来载入我们所需要的Class。默认的是system classloader。利用这个特性,我们可以“打破”classloader委托机制了,父classloader可以获得当前线程的context classloader,而这个context classloader可以是它的子classloader或者其他的classloader,那么父classloader就可以从其获得所需的 Class,这就打破了只能向父classloader请求的限制了。这个机制可以满足当我们的classpath是在运行时才确定,并由定制的 classloader加载的时候,由system classloader(即在jvm classpath中)加载的class可以通过context classloader获得定制的classloader并加载入特定的class(通常是抽象类和接口,定制的classloader中是其实现),例如web应用中的servlet就是用这种机制加载的.
ClassLoader的工作原理
每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类
系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类
可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为
ClassLoader被组织成树形,一般的工作原理是:
1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类
2) contextClassLoader请求它的父ClassLoader来完成该载入请求
3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入
评论
发表评论
-
OSGI环境下配置log4j日志
2009-05-07 14:07 1447log4j相信大家都用过的 ... -
Java虚拟机类装载:原理、实现与应用
2009-05-07 09:50 1531Java虚拟机类装载:原理、实现与应用 By jo ... -
Java程序类加载完全揭密
2009-05-07 09:49 1116Java程序类加载完全揭密 ... -
Java的类装载器(Class Loader)和命名空间(NameSpace)
2009-05-07 09:48 1790Java的类装载器(Class Loader)和命名空间(Na ... -
Java类装载体系中的隔离性
2009-05-07 09:28 1430Java类装载体系中的隔离性 正文 Java中类 ... -
了解 JAVA classloader
2009-05-07 09:21 1106什么是 ClassLoader? ... -
如何实现自己的classloader
2009-05-07 09:12 2060如何实现自己的classloader 如何实现自己的clas ... -
ClassLoader原理
2009-05-07 09:06 1038JVM规范定义了两种类型的类装载器:启动内装载器(bootst ... -
JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecuto
2009-04-03 11:32 1330在多线程大师Doug Lea的 ... -
MD5
2009-03-17 09:17 1027使用 Java 生成 MD5 编码 MD5即 ... -
JAVA字符串处理函数列表一览
2009-03-14 16:48 2043Java中的字符串也是一连串的字符。但是与许多其他的计算机语言 ... -
StringTokenizer(字符串分析解析类型)(转)
2009-03-14 16:35 3140功效:将字符串以定界符为界,分析为一个个的token(可理解为 ... -
JAVA乱码分析
2009-03-14 16:33 2197UNICODE编码,它采用双字 ... -
java.util.UUID
2008-12-19 18:01 4976GUID是一个128位长的数字,一般用16进制表示。算法的核心 ... -
java应用程序中动态生成PDF文件
2008-12-11 17:05 1206很多应用程序要求动态 ... -
JAVA和JAVAC 命令行
2008-12-11 17:03 2612javac和java命令行中的-classpath选项这是个很 ... -
创建java的可执行文件
2008-12-11 16:59 1406Jar工具的作用是java程序中若干文件联合压缩到一个Jar包 ... -
深入对象复制与比较
2008-12-04 10:09 15361.对象的复制2.clone()的使用3.对象实例的比较/// ... -
解析Java对象的equals()和hashCode()的使用
2008-12-04 10:07 876在Java语言中,equals()和h ... -
Java基础:深入 JAVA对象的复制与比较
2008-12-04 10:06 8881.对象的复制2.clone()的使用3.对象实例的比较/// ...
相关推荐
9. **缓存策略**: 图片加载库通常具有智能缓存机制,将图片存储在内存和磁盘中,下次加载时可以从缓存中快速获取,减少网络请求。 10. **网络请求**: 使用异步加载图片时,通常需要进行网络请求。Android提供了...
1:JVM内存模型:类加载机制【转载、验证、准备、解析、初始化】+类装载器【装载器分类、加载原则】+运行时数据区【方法区、堆、虚拟机栈、本地方法栈、程序计数器】。 2:垃圾回收:垃圾确定【引用计数法、可达性分析...
5. **类加载机制** Hotspot遵循双亲委托模型进行类加载,从Bootstrap ClassLoader开始,逐级向下查找,直到找到对应的类。这个过程涉及类的加载、验证、准备、解析和初始化。 6. **编译优化技术** Hotspot采用...
11. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)以及JVM调优,有助于提升程序性能。 12. **Java 8及以后的特性**:从Java 8开始,引入了Lambda表达式、Stream API和...
6. **资源管理**:通过高效的资源管理和类加载机制,OSGi可以在有限的硬件资源下运行,这解释了为什么它能在BMW汽车的通信-娱乐系统中表现出色。 Eclipse集成开发环境(IDE)与OSGi有着深厚的联系。Eclipse 3.0开始...
**4.8 类加载机制** - 每个类都应该只被加载一次,以确保资源的有效利用。 - 理解类加载器的工作原理对于优化程序性能至关重要。 **4.9 AWT组件** - Java 1.1 中的AWT组件应当谨慎使用。 - 选择合适的GUI框架,例如...
了解类加载过程,特别是静态块和构造器的执行顺序,可以帮助解决一些复杂的初始化问题。 接下来是继承,这是面向对象编程的核心概念之一。Java支持单一继承,即一个类只能直接继承自一个父类,但可以通过接口实现...
本文将深入解析Java字节码的格式,帮助你理解其背后的运行机制。 1. **Java字节码结构** Java字节码文件由多个部分组成,包括魔数、版本号、常量池、访问标志、类和父类索引、接口索引集合、字段表集合、方法表...
9. **懒加载和级联操作**: 懒加载允许延迟加载关联的对象,减少内存消耗;级联操作可以在父对象上直接操作子对象,简化编程。 10. **缓存机制**: Hibernate提供了一级缓存(Session级别)和二级缓存...
地图的加载和解析也是游戏启动阶段的重要步骤,开发者可能使用MFC的文件操作类,如CFile和CStdioFile,来读取地图数据。 此外,音效和音乐的集成也是提升游戏体验的关键。MFC虽然不直接支持音频处理,但开发者可以...
【压缩包子文件的文件名称列表】中的"endorsed"通常与Java的类加载机制有关。在Java中,endorsed目录用于放置那些需要覆盖JDK内置库的第三方类库,例如新版本的JSR规范实现。在部署或运行包含JSR168 portlet的应用时...
合理规划路径、重构文件加载机制、合理管理调试代码以及确保代码的跨平台兼容性,都是提升PHP项目稳定性、可维护性和效率的关键步骤。希望每位开发者都能从中获益,不断精进自己的技能,创造出更加优秀的软件产品。
类的加载过程包括类加载器加载字节码文件到内存、jvm 内存数据区将对象状态放置在堆区、各线程使用的变量放在栈区、类的特征放在方法区,然后进行字节码验证再执行。 7. 类的语法与规范 一个源文件只能有一个 ...
Dojo的模块和包管理机制允许按需加载,这在优化性能和减小网络传输量方面很有帮助。例如,当你需要使用`dojo.math`模块时,可以通过`dojo.require("dojo.math")`来声明。同样,`dojo.io.*`和`dojo.widget.*`代表了...
- **Context配置**:定义了一个特定的Web应用程序,包括其根路径、文档基础和类加载器设置。 - **Connector配置**:定义了Tomcat如何监听和响应网络请求,包括端口、协议和线程池配置。 - **Realm配置**:用于用户...
深入理解JVM一、什么是JVM二、JAVA的运行机制三、JVM架构图四、类加载器子系统1、类加载器子系统作用2、加载(Loading)3、链接(Linking)3.1 验证 (Verify)3.2 准备(Prepare)3.3 解析(Resolve)3、初始化4、...
Tomcat使用自定义的ClassLoader来加载Web应用的类,每个Web应用都有自己的独立ClassLoader,这种设计确保了应用间的类隔离,避免了类冲突。 5. **JNDI服务**: Tomcat提供JNDI(Java Naming and Directory ...
19. JVM:涵盖Java虚拟机的内存模型、垃圾回收机制、类加载机制、性能调优等高级概念。 除了上述模块,文章还强调了对于面试题的深入解析和代码案例的提供,这对于面试者理解知识点、整理思路和表达能力的培养是至...
5. **多语言支持**:对于国际化应用,插件可能内置多语言机制,方便切换不同语言环境。 6. **可配置选项**:包括Tab的关闭按钮、动画效果、默认选中项等,可通过配置参数进行设定。 7. **兼容性**:确保在主流...
重制seo机制,全面支持网站、分类、标签、文章、页面等自定义标题、自定义描述、自定义关键词。安装新主题后,请重新设置SEO选项 优化右侧栏头像小工具,默认都显示。只有在转载形式时,隐藏。 优化原创、投稿、转载...