问题背景

本问题源于《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

最新文章

  1. 简析服务端通过GT导入SHP至PG的方法
  2. Swift3.0变化分享
  3. 【Alpha版本】项目测试
  4. 0040 Linux 系统管理命令
  5. Subsets 子集系列问题 leetcode
  6. android EditText长按屏蔽ActionMode context菜单但保留选择工具功能
  7. Ubuntu 14.04 – How to install xrdp in Ubuntu 14.04
  8. 使用C#选择文件夹、打开文件夹、选择文件
  9. 【译】UI设计基础(UI Design Basics)--自动适配与布局(Adaptivity and Layout)(四)
  10. 开发者应当了解的WebKit知识
  11. myFocus焦点图插件
  12. 遍历hashMap对效率的影响
  13. 用Spring Tools Suite(STS)开始一个RESTful Web Service
  14. mybatis整合spring获取配置文件信息出错
  15. 使用Pyspark进行特征工程时的那些坑
  16. python-面向对象-04_面向对象封装案例
  17. 20180409 Code First
  18. visual studio利用 indent guides 格式化代码 添加竖线
  19. mysql 字符串数值计算 精度丢失
  20. centos7 部署 nginx+tomcat+MariaDB 环境并安装安全狗,使用natapp隧道

热门文章

  1. DQN(Deep Q-learning)入门教程(零)之教程介绍
  2. Spring MyBatis配置文件
  3. Istio DestinationRule 目标规则
  4. 利用pandas进行数据子集的获取
  5. eatwhatApp开发实战(四)
  6. [PHP学习教程 - 数字]001.数字补0(Num padding)
  7. 应小姐姐要求,整理常用Git操作命令,她都学会了,你确定不收藏
  8. Spring_AOP_AspectJ支持的通知注解
  9. 04 . 前端之JQuery
  10. Rocket - debug - TLDebugModuleInner - Abstract Command Decoding &amp; Generation