IBM WebSphere 9.5类加载器频繁调用引发应用严重性能问题
排查IBM WebSphere 9.5类加载器频繁解压压缩文件的步骤
一、定位被解压的具体压缩文件
- 启用WebSphere自带的跟踪日志:在WAS控制台配置跟踪组件
com.ibm.ws.classloader.*=all,重启应用后执行登录/操作,导出跟踪日志并搜索包含“extract”“unpack”“JarFile”的条目,这些日志会明确显示被解压的文件路径(如共享库中的JAR、应用WAR/EAR内的嵌套包)。 - 用系统级工具监控文件操作:Linux环境下用
strace -p <WAS进程ID> -e open,read | grep -E "\.jar|\.war|\.ear"跟踪文件访问;Windows环境用Process Monitor筛选WAS进程的文件操作,过滤.jar/.war/.ear后缀的文件,查看哪些文件被反复读取和解压。 - 深挖Java Melody监控数据:查看监控到的类加载相关调用栈,定位触发解压的具体方法(如
ClassLoader.getResource、JarInputStream实例化),追溯到对应的业务类和依赖库。
二、分析触发解压的核心原因
- 检查共享库配置:确认共享库是否开启了“解压文件”选项——该选项若启用,WAS会在类加载时将压缩包解压到临时目录,频繁触发会导致性能损耗。
- 复核类加载策略:即使调整过类加载方式,仍需确认:WAR/EAR的类加载顺序(父优先/子优先)是否合理,共享库是关联到应用级还是模块级,是否存在同一类在共享库和应用包中重复存在的情况(类重复会引发类加载器反复加载和解压)。
- 排查应用代码的资源访问逻辑:检查是否有代码频繁直接读取JAR/WAR内的资源(如配置文件、静态资源),且未做缓存处理——每次调用
getResourceAsStream或JarFile.getEntry都可能触发类加载器解压操作。
三、针对性优化措施
- 清理冗余依赖:若发现同一类在共享库和应用包中重复存在,删除其中一处的冗余依赖,消除类加载冲突。
- 关闭共享库的“解压文件”选项:若应用无需直接访问压缩包内的文件系统路径,关闭该选项,让WAS直接从压缩包读取资源,避免解压操作。
- 缓存高频访问的资源:将频繁读取的JAR内资源(如配置文件)加载到内存缓存中,避免每次操作都触发类加载器的解压逻辑。
- 确保类加载器缓存启用:在WAS控制台确认类加载器缓存(
Enable class loader caching)已开启,减少重复类加载的次数。
内容的提问来源于stack exchange,提问作者Manohar Amkem
相关产品推荐
相关产品推荐

