线上排查Class、Jar加载问题的一般方法
问题背景
本问题源于《ojdbc6中OraclePreparedStatement的ArrayIndexOutOfBoundsException异常BUG-6396242》这篇博文中最后思考的问题。
假如你的线上环境没有安装arthas,也无法追加–verbose:class或-XX:+TraceClassLoading然后重启,那么如何来定位具体class来自哪个jar包呢?
解决方法
使用中间件产品模块
WebSphere
Class Loader Viewer:Admin console -> Troubleshooting -> Class Loader Viewer
WebLogic
Classloader Analysis Tool (CAT):
10.3.x 版本以后的版本Development模式中Deployments -> app_name -> Testing -> Classloader ->Analysis Tool.
但对于Production模式而言,则需要手动部署wls-cat.war,这种方式在线上环境意义不大。
使用Linux的lsof命令
lsof(List of Open Files)本质上是读取内存文件系统/proc/pid下的各种文件操作符,在一切皆文件的Linux世界没有lsof看不到的存在。
lsof –p <pid>
使用dump文件追踪相关的jar信息
使用jmap或者arthas拿到进程dump信息(线上环境要注意dump过程对机器的影响),然后jhat或者mat进行分析,这里为了方便使用mat。
首先查询出已知类的Classloader的所有实例,然后通过其成员寻找相关的加载路径和加载地址。
Tomcat
Tomcat几乎全部的jar都是由WebappClassLoader负责加载。
Weblogic
weblogic的AppClassLoader只加载了自定义domain里面的的相关jar,最终并没有涉及我们应用自身的/WEB-INF/lib下的jar
思考总结
应用运维角度
对于成熟的中间件产品来说应该使用专门的依赖库分析工具。系统运维角度
利用lsof命令或者获取/proc/pid信息可以获取每个进程持有的相关资源当然包括打开的文件。开发人员角度
通过jvm相关工具(jmap+jhat)可以拿到内存中任意class类的Classloader的实例以及其成员,当然这需要开发人员的配合或者运维人员具有一定的开发经验。
综合来看,三个角度中从开发角度考虑是最繁琐的。开发人员可以在开发测试阶段完全从代码层面跟踪具体问题,当然前提是测试发现了问题。
参考链接:
https://docs.oracle.com/cd/E24329_01/web.1211/e24368/classloading.htm#WLPRG495
最新文章
- 简析服务端通过GT导入SHP至PG的方法
- Swift3.0变化分享
- 【Alpha版本】项目测试
- 0040 Linux 系统管理命令
- Subsets 子集系列问题 leetcode
- android EditText长按屏蔽ActionMode context菜单但保留选择工具功能
- Ubuntu 14.04 – How to install xrdp in Ubuntu 14.04
- 使用C#选择文件夹、打开文件夹、选择文件
- 【译】UI设计基础(UI Design Basics)--自动适配与布局(Adaptivity and Layout)(四)
- 开发者应当了解的WebKit知识
- myFocus焦点图插件
- 遍历hashMap对效率的影响
- 用Spring Tools Suite(STS)开始一个RESTful Web Service
- mybatis整合spring获取配置文件信息出错
- 使用Pyspark进行特征工程时的那些坑
- python-面向对象-04_面向对象封装案例
- 20180409 Code First
- visual studio利用 indent guides 格式化代码 添加竖线
- mysql 字符串数值计算 精度丢失
- centos7 部署 nginx+tomcat+MariaDB 环境并安装安全狗,使用natapp隧道
热门文章
- DQN(Deep Q-learning)入门教程(零)之教程介绍
- Spring MyBatis配置文件
- Istio DestinationRule 目标规则
- 利用pandas进行数据子集的获取
- eatwhatApp开发实战(四)
- [PHP学习教程 - 数字]001.数字补0(Num padding)
- 应小姐姐要求,整理常用Git操作命令,她都学会了,你确定不收藏
- Spring_AOP_AspectJ支持的通知注解
- 04 . 前端之JQuery
- Rocket - debug - TLDebugModuleInner - Abstract Command Decoding &; Generation