Author:dyyx007 东阳游侠
http://hi.baidu.com/ajf8/home
http://weibo.com/dyyx007
tomcat6.0.32
com.dyyx.ShareUtils
//返回系统当前时间
public static String now();
package com.dyyx;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ShareUtils {
private static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static String now() {
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat(FULL_DATE_FORMAT);
return dateFormat.format(now);
}
}
http://127.0.0.1:8080/tools/share_utils_now.jsp
share_utils_now.jsp 里调用 ShareUtils.now() 输出当前时间
并且会调用getClassLoadInfo(Class c) 方法 输出 ShareUtils.class 的类加载器信息 代码如下
public static String getClassLoadInfo(Class c) {
String rname = getResourceName(c);
URL url = null;
ClassLoader cl = c.getClassLoader();
// 如果ClassLoader为NULL 为系统类
if (null == cl) {
url = ClassLoader.getSystemResource(rname);
} else {
url = cl.getResource(rname);
}
String s = "class=" + c + ",classloader:" + cl + ",url=" + url;
s = s + ",resourceName=" + rname;
s = s + "\n\n";
while (cl != null) {
cl = cl.getParent();
s = s + cl + "\n";
}
return s;
}
public static String getResourceName(Class clazz) {
if (null == clazz) {
return "class is null";
}
String cname = clazz.getName();
String[] arr = cname.split("\\.");
String rname = "";
int len = arr.length;
for (int i = 0; i < len; i++) {
if (i > 0) {
rname = rname + "/";
}
rname = rname + arr[i];
}
rname = rname + ".class";
return rname;
}
share-utils.jar 包含 ShareUtils.class
类加载顺序
${JAVA_HOME}/jre/lib/ext
java classpath
${webapp}/WEB-INF/classes
${webapp}/WEB-INF/lib
${tomcat.home}/lib
bootstrap class loader 引导类加载器 加载java核心类库 不是java.lang.ClassLoader的实例
ExtClassLoader 的父加载器为 bootstrap class loader 但是 getParent()拿到是null
把 share-utils.jar 或 ShareUtils.class 依次从相应的目录移除
以下为各种类加载情况日志记录
1 ExtClassLoader ${JAVA_HOME}/jre/lib/ext
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$ExtClassLoader@addbf1,url=jar:file:/D:/soft/jdk1.6.0_21/jre/lib/ext/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
null
2 AppClassLoader java classpath
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$AppClassLoader@19821f,url=jar:file:/D:/tomcat6min/bin/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
sun.misc.Launcher$ExtClassLoader@addbf1
null
3 WebappClassLoader ${webapp}/WEB-INF/classes
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=file:/D:/soft/book/high/code/action/webroot/WEB-INF/classes/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
4 WebappClassLoader ${webapp}/WEB-INF/lib
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=jar:file:/D:/soft/book/high/code/action/webroot/WEB-INF/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
5 StandardClassLoader ${tomcat.home}/lib
class=class com.dyyx.ShareUtils,classloader:org.apache.catalina.loader.StandardClassLoader@1172e08,url=jar:file:/D:/tomcat6min/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
双亲委派模型
引导类加载器 扩展类加载器 应用(系统)类加载器 自定义类加载器(L1) 自定义类加载器(L2) 自定义类加载器(Ln) ......
tomcat6类加载器示意图 http://hiphotos.baidu.com/ajf8/pic/item/3a7fe938b6003af37d7927d2352ac65c1238b6ea.jpg
原文链接 http://hi.baidu.com/ajf8/blog/item/055bac5394f386100df3e3f9.html
http://hi.baidu.com/ajf8/home
http://weibo.com/dyyx007
tomcat6.0.32
com.dyyx.ShareUtils
//返回系统当前时间
public static String now();
package com.dyyx;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ShareUtils {
private static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static String now() {
Date now = new Date();
DateFormat dateFormat = new SimpleDateFormat(FULL_DATE_FORMAT);
return dateFormat.format(now);
}
}
http://127.0.0.1:8080/tools/share_utils_now.jsp
share_utils_now.jsp 里调用 ShareUtils.now() 输出当前时间
并且会调用getClassLoadInfo(Class c) 方法 输出 ShareUtils.class 的类加载器信息 代码如下
public static String getClassLoadInfo(Class c) {
String rname = getResourceName(c);
URL url = null;
ClassLoader cl = c.getClassLoader();
// 如果ClassLoader为NULL 为系统类
if (null == cl) {
url = ClassLoader.getSystemResource(rname);
} else {
url = cl.getResource(rname);
}
String s = "class=" + c + ",classloader:" + cl + ",url=" + url;
s = s + ",resourceName=" + rname;
s = s + "\n\n";
while (cl != null) {
cl = cl.getParent();
s = s + cl + "\n";
}
return s;
}
public static String getResourceName(Class clazz) {
if (null == clazz) {
return "class is null";
}
String cname = clazz.getName();
String[] arr = cname.split("\\.");
String rname = "";
int len = arr.length;
for (int i = 0; i < len; i++) {
if (i > 0) {
rname = rname + "/";
}
rname = rname + arr[i];
}
rname = rname + ".class";
return rname;
}
share-utils.jar 包含 ShareUtils.class
类加载顺序
${JAVA_HOME}/jre/lib/ext
java classpath
${webapp}/WEB-INF/classes
${webapp}/WEB-INF/lib
${tomcat.home}/lib
bootstrap class loader 引导类加载器 加载java核心类库 不是java.lang.ClassLoader的实例
ExtClassLoader 的父加载器为 bootstrap class loader 但是 getParent()拿到是null
把 share-utils.jar 或 ShareUtils.class 依次从相应的目录移除
以下为各种类加载情况日志记录
1 ExtClassLoader ${JAVA_HOME}/jre/lib/ext
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$ExtClassLoader@addbf1,url=jar:file:/D:/soft/jdk1.6.0_21/jre/lib/ext/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
null
2 AppClassLoader java classpath
class=class com.dyyx.ShareUtils,classloader:sun.misc.Launcher$AppClassLoader@19821f,url=jar:file:/D:/tomcat6min/bin/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
sun.misc.Launcher$ExtClassLoader@addbf1
null
3 WebappClassLoader ${webapp}/WEB-INF/classes
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=file:/D:/soft/book/high/code/action/webroot/WEB-INF/classes/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
4 WebappClassLoader ${webapp}/WEB-INF/lib
class=class com.dyyx.ShareUtils,classloader:WebappClassLoader
context:
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@1172e08
,url=jar:file:/D:/soft/book/high/code/action/webroot/WEB-INF/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
org.apache.catalina.loader.StandardClassLoader@1172e08
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
5 StandardClassLoader ${tomcat.home}/lib
class=class com.dyyx.ShareUtils,classloader:org.apache.catalina.loader.StandardClassLoader@1172e08,url=jar:file:/D:/tomcat6min/lib/share-utils.jar!/com/dyyx/ShareUtils.class,resourceName=com/dyyx/ShareUtils.class
sun.misc.Launcher$AppClassLoader@19821f
sun.misc.Launcher$ExtClassLoader@addbf1
null
双亲委派模型
引导类加载器 扩展类加载器 应用(系统)类加载器 自定义类加载器(L1) 自定义类加载器(L2) 自定义类加载器(Ln) ......
tomcat6类加载器示意图 http://hiphotos.baidu.com/ajf8/pic/item/3a7fe938b6003af37d7927d2352ac65c1238b6ea.jpg
原文链接 http://hi.baidu.com/ajf8/blog/item/055bac5394f386100df3e3f9.html
发表评论
-
缓存对比
2016-03-20 20:29 0最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有 ... -
负载均衡
2016-03-20 20:22 0对软件实现负载均衡的几个软件,小D详细看了一下,从性能和稳定上 ... -
API 限流
2016-03-20 16:55 0服务接口API限流 一、场景描述 ... -
做项目时需要考虑的安全性问题
2013-04-19 11:38 526做项目时需要考虑的安全性问题 转:http://ningand ... -
Java中可扩展性
2013-04-18 16:54 0第一招:所有功能,不论客户端还是服务端,全部面向服务开发,使用 ... -
(转)网站架构资料收集整理
2013-04-19 11:38 6731.系统概况图 图1.1 系 ... -
远程调用对比RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS
2013-04-18 11:19 0在分布式服务框架中, ... -
EhCache使用详细介绍(转)
2013-04-18 10:24 648EhCache使用详细介绍(转) Ehcache中不仅可以用配 ... -
Java中可扩展性的实现
2013-04-18 10:25 997Java中可扩展性的实现 在JAVA中程序的可扩 ... -
灵活性和可扩展性
2013-04-16 13:44 0通常成对出现。程序 ... -
Node.js 究竟是什么?
2013-04-17 00:00 540Node.js 究竟是什么? 简 ... -
Node.js初体验
2013-04-16 11:23 0服务器端 JS 情缘 在校 ... -
Tomcat性能调优-让小猫飞奔
2013-04-17 00:01 613Tomcat性能调优-让小猫飞奔 apacheApacheco ... -
大型在线系统实现的关键
2013-04-16 10:40 689负载均衡--大型在线 ...
相关推荐
这个"DevLoader.zip"文件可能包含与Tomcat自定义类加载器相关的资料,特别是名为"DevLoader"的类加载器,这可能是Tomcat为开发者提供的一种特殊加载器。 首先,我们来理解一下类加载器的基本概念。在Java中,类加载...
Tomcat通过自定义的类加载器实现了特定的类加载顺序,以确保能够正确处理不同来源的类文件,避免类的重复加载和类版本冲突问题。以下是Tomcat启动过程中类加载的具体顺序: #### 三、类加载顺序详述 1. **Bootstrap...
在Tomcat中,我们可以通过配置`catalina.properties`文件和`server.xml`文件来调整类加载策略,例如设置自定义的类加载顺序或启用共享类加载器。 此外,Tomcat还支持热部署,即在不重启服务器的情况下更新Web应用的...
当程序运行时,JVM会根据需求通过不同的类加载器加载相应的类。这确保了内存的有效利用和程序的高效运行。JVM中的类加载器包括Bootstrap类加载器、Extension类加载器和Application类加载器。 2. **JVM的类加载策略*...
Tomcat的类加载器遵循特定的加载顺序,确保了不同应用间的隔离性和资源的正确加载。下面将详细解析Tomcat的类加载过程及其顺序。 #### 1. Bootstrap ClassLoader 这是JVM自带的类加载器,用于加载核心的类库,如`...
接下来,Common类加载器加载公共库,这些库可以被所有Web应用程序访问。它主要负责加载`common.loader`属性指定的类路径下的类和资源,比如`$CATALINA_BASE/common/classes`和`$CATALINA_BASE/common/lib`下的文件...
具体来说,Tomcat8使用了“沙盒”概念,每个Web应用都有自己的类加载器,这样可以避免全局类加载器的冲突。但是,这也意味着JAR包的加载顺序不再固定,可能会因操作系统的差异或配置的变化而有所不同。例如,在Linux...
Tomcat内部定义了多个类加载器,包括Bootstrap、Extension、Application(分别对应JDK的启动类加载器、扩展类加载器和应用程序类加载器),以及Tomcat自定义的Common、Catalina、Shared和WebappX类加载器。...
6. **优化的加载顺序**: Tomcat通过自定义加载顺序,使得应用可以覆盖服务器级别的类库,从而实现了更灵活的部署和扩展。 `classloader2.vsd`文件可能是类加载器层次结构的Visio绘图文件,它能直观地展示上述类加载...
5. "tomcat加载类的顺序.doc":详细说明了Tomcat加载类的具体步骤和顺序,这对于理解和调试类加载问题至关重要。 6. "Tomcat源码研究.pdf":提供了一个全面的源码分析概览,可能包括了Tomcat的主要组件、设计模式...
理解类加载顺序和隔离机制,能避免类冲突,保证应用的正常运行。 5. **Tomcat权威指南** "Tomcat权威指南"通常涵盖Tomcat的安装、配置、安全管理、集群、连接池、日志和性能调优等方面。阅读这本书可以系统地学习...
它使用了多个类加载器来加载不同的类和资源。这些类加载器包括: * Bootstrap:加载 Java 的核心类库 * System:加载系统类库 * Common:加载 Tomcat 的公共类库 * Catalina:加载 Tomcat 的私有类库 * Shared:...
1. **加载顺序**:在Tomcat中,类的加载遵循特定的顺序。通常情况下,每个子类加载器会先尝试从自己的类路径中加载类,如果找不到,则会向上委托给父类加载器进行加载。这种委托模式确保了类的单一性和安全性。 2. ...
Spring 和 SpringMVC 的配置加载顺序是理解这两个框架协同工作的重要方面。首先,DispatcherServlet 是 SpringMVC 的核心组件,它扮演着请求分发者的角色,确保请求被正确地路由到相应的处理器。DispatcherServlet ...
在深入理解Java虚拟机(JVM)如何加载Class文件之前,我们需要明确一点:Java的所有类都需要通过类加载器加载到JVM中才能被执行。这个过程对开发者来说通常是透明的,但在一些特殊情况下,例如使用反射时,了解类加载...
这个机制保证了类的加载顺序是由上至下,先由父类加载器尝试加载,若失败则由子类加载器接手。这样确保了基础类的优先加载,同时避免了恶意基础类的注入。 1. 装载阶段:这是类加载的第一步,查找并导入class文件。...