没有合适的资源?快使用搜索试试~ 我知道了~
详细描述weblogic类加载机制及过程
资源推荐
资源详情
资源评论
10 理解 weblogic 的应用类加载
10.1 java 类加载
类加载器是 java 语言中非常重要的一个模块。一个类加载器是 jvm 的一部分,它把类加载
到内存中。类加载器负责在程序运行时查找和加载类。每个成功的 java 程序员都应该理解
类加载器和它的行为特征。
10.1.1java 类加载器层次
类加载器的层次中有父加载器和子加载器。父子加载器之间的关系类似于父类和子类的关系。
引导类加载器是 java 类加载器层次中的根加载器,由它来加载 jdk 的内部类,以及 jvm 中
java.*包。(例如:java.lang.String 是由引导类加载器加载)
扩展类加载器是引导类加载器的子加载器。扩展类加载器加载 jdk 扩展目录中的 jars。这样
可以很方便的扩展 jdk 而不必往 classpath 中增加类。但是扩展目录中的所有类必须是自包含
的,只能引用扩展目录中和 jdk 的类。
系统类路径加载器扩展了扩展类加载器,系统类路径加载器加载 jvm 的 classpath 中的类。
特定应用程序的类加载器(包括 weblogic 服务器类加载器)是系统类路径加载器的子加载
器。
注:
Oracle
所引用的系统类路径加载器,一般是指
weblogic
服务器之外所说的应用程序类加
载器。在
weblogic
中讨论类加载器时,
Oracle
使用系统类加载器来区别和
java ee
应用程序
相关联的类加载器(
Oracle
称之为应用程序类加载器)。
10.1.2 加载一个类
类加载器使用委托模型来加载类。类加载器首先检查缓存看请求的类是否已经加载。这个检
查提高了性能,因为它使用缓存的类,而不是每次都从磁盘加载类。如果请求的类在缓存中
不存在,则当前的类加载器会请求父类加载器为其加载该类。只有当父类加载器不能加载时,
当前的类加载器才去加载,如果一个类同时存在于父和子类加载器中,则父类加载器中的类
会被加载。按照这个委托模型,可以避免一个类加载多个副本。一个类的多个副本会导致类
转的错误。
类加载器在加载类之前先请求父类为其加载。Weblogic 中和 web 应用关联的类加载器可以
配置为先检查本地加载,如果本地不能加载再去请求父类加载器为其加载。这样对于同时被
weblogic 和 web 应用使用到的类,就可以使 web 应用优先使用第三方的类版本。
10.1.3 prefer-web-inf-classes 元素
Weblogic.xml 包含一个 prefer-web-inf-classes 元素(container-descriptor 的子元素)。该元素
的默认值为 false。设置为 true 时,会反转类加载器委托模型,web 应用中类的使用会优先
于上级类加载器中类。这使得 web 应用可以使用自己所包含的第三方类。
使用这种设置时,注意不要混淆了从 web 应用加载的类创建的实例和从服务器中加载的类
创建的实例。如果混淆了,可能会造成类转换错误。
Example 10–1 prefer-web-inf-classes Element
/**
* If true, classes located in the WEB-INF directory of a web-app will be
* loaded in preference to classes loaded in the application or system
* classloader.
* @default false
*/
boolean isPreferWebInfClasses();
void setPreferWebInfClasses(boolean b);
10.1.4 在运行的程序中替换类
Weblogic 允许在服务器运行的时候部署新版本的应用模块。这个过程称之为热部署,和类加
载密切相关。
java 类加载器没有标准的机制卸载类和加载新版本的类。为了更新正运行在虚拟机,加载已
变更类的加载器必须替换为一个新的类加载器。当一个类加载器被替换,所有从这个类加载
器(或者这个类加载器的下级加载器)加载的类都要重新加载。这些类的所有实例必须重新
实例化。
在 weblogic 中,每个应用都有一个作为系统类加载器的子加载器的类加载器层次。这些类
加载器层次运行应用或者应用的一部分独立的重加载而不影响系统的其他部分。
10.1.5 配置类缓存
weblogic 现在支持类缓存,从而加快启动。一旦设置了缓存,服务器会记录所有加载的类,
直到一个满足特定的标准,然后把这些类的定义保存在一个不可见的文件中。当服务器重启,
会检查缓存的有效性,然后以同样的顺序批量加载上一次运行时记录的类。如果系统类路径
或者类的内容发生了变化,缓存将失效,并且服务器重启时会重新加载。
类缓存的好处时:
1. 减少服务器启动时间
2. 包一级的索引减少了所有类和资源的搜索时间
缓存使用优化技术最小化开始的缓存记录时间。缓存记录持续到一个特定的类被记录。
注:开发模式下使用
startWeblogic
脚本启动服务器时支持类缓存。在生产模式下类缓存默
认被禁用并且不被支持。启动时减少的时间因不同的
jre
供应商而不同。
1. 要支持类缓存,在 startWeblogic 脚本中设置一个环境变量(CLASS_CACHE=true for
UNIX, set CLASS_CACHE=true for Windows)。
2. 使用下面的属性配置类缓存:
a) 日志:要调试类缓存的问题,在 startWeblogic 脚本中打开日志开关:
-Dclass.load.log.level=finest
-Dclass.load.log.file=/tmp/class-load-log.txt
有 3 种日志级别,fine, finer, finest。在常规的缓存操作中不要开启日志。开启日志会使服务
器启动变慢,仅在调试的时候打开日志。
b) Recording Limit:虽然 Recording Limit 被设置为一个特定的类,但这个类可以被设
置为一个不同的类。
-Dlaunch.complete=<fully qualified class name> for example
com.oracle.component.Foo
这个类必须在 weblogic 的系统路径中。
Example 10–2 startWebLogic scripts
On UNIX
# CLASS CACHING
CLASS_CACHE=true
if [ "${CLASS_CACHE}" = "true" ] ; then
echo "Class caching enabled..."
JAVA_OPTIONS="${JAVA_OPTIONS} -Dlaunch.main.class=${SERVER_CLASS}
-Dlaunch.class.path="${CLASSPATH}"
-Dlaunch.complete=weblogic.store.internal.LockManagerImpl
-Dclass.load.log.level=finest
-Dclass.load.log.file=/tmp/class-load-log.txt
-cp ${WL_HOME}/server/lib/pcl2.jar"
export JAVA_OPTIONS
SERVER_CLASS="com.oracle.classloader.launch.Launcher"
fi
On Windows
@REM CLASS CACHING
set CLASS_CACHE=true
if "%CLASS_CACHE%"=="true" (
echo Class caching enabled...
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dlaunch.main.class=%SERVER_CLASS%
-Dlaunch.class.path="%CLASSPATH%" -Dclass.load.log.level=finest
-Dclass.load.log.file=C:\class-load-log.txt
-Dlaunch.complete=weblogic.store.internal.LockManagerImpl
-cp %WL_HOME%\server\lib\pcl2.jar
set SERVER_CLASS=com.oracle.classloader.launch.Launcher
weblogic 应用类加载
10.2.1weblogic 服务器的应用类加载概述
weblogic 类加载的重点是应用。一个应用一般是一个 ear 包,可能包含 3 部分:ejb jar,web
应用 war,资源适配器 rar。
如果 ejb jar 和 web war 单独部署,不在 ear 包内,则当作单独的应用。
每个应用有自己独立的类加载器层次结构。这个类加载器层次的上级是 weblogic 的系统类
加载器。
这样就隔离了应用,应用 A 是不能访问应用 B 的类加载器和类的。应用中的代码只能访问
到与当前应用关联的类加载器加载的类或者应用加载器的上级加载器加载的类。
这样 weblogic 可以在同一个 jvm 中持有多个独立的应用。
10.2.2 应用的类加载器层次结构
在部署一个应用时,weblogic 自动创建一个类加载器层次。
这个层次的根加载器加载应用中的 ejb jar 文件。
每个 web war 应用包都有一个独立的子加载器。
通常 web 应用会调用 ejb,weblogic 的应用类加载器的体系结构允许 jsp 和 servlets 访问它们
上级加载器中 ejb 接口。这种体系结构允许在不重新部署 ear 的情况下重新部署 war。
事实上,jsp 和 servlets 会被经常修改,而 ejb 层的修改比较少。
剩余17页未读,继续阅读
资源评论
zzycy08
- 粉丝: 1
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功