jvm突然crash或报ClassNotFoundException

具体场景​ 最近项目中基于jarslink做实时算法的加载,为了方便jar包更新测试,我们把jar包开发完后以snapshot版本推送到maven中央仓库中。jarslink查询器根据配置动态从maven仓库加载算法jar包及其依赖。为了在jar包发生改变时动态刷新,代码中农将对应jar包的md5作为版本version的一部分。在代码发生修改时,重新推送jar包到maven仓库,代...
摘要由CSDN通过智能技术生成

具体场景

​ 最近项目中基于jarslink做实时算法的加载,为了方便jar包更新测试,我们把jar包开发完后以snapshot版本推送到maven中央仓库中。jarslink查询器根据配置动态从maven仓库加载算法jar包及其依赖。为了在jar包发生改变时动态刷新,代码中农将对应jar包的md5作为版本version的一部分。在代码发生修改时,重新推送jar包到maven仓库,代码中的maven加载器动态刷新插件jar包,并重新加载子容器,此时意外发生了,jvm crash,多次试验,java虚拟机不是crash就是报ClassNotFoundException,原因为何?这就是本文要说的:不要在java虚拟机运行时替换正在使用的jar包!

具体原因探索

​ 既然jar包名称和原来的一模一样,jar包里面的类也一致,为什么jvm就加载不到这个jar包里面的类呢?要回答这个问题,我们可以先通过lsof来查看一下某个java进程打开的文件句柄:

lsof | grep java 6213

在这里插入图片描述

我们可以看到,这个java进程维护了多个jar包文件的句柄。通过这个,我们可以想到应该是jvm在运行中维护了这些jar包的inputstream,在需要某个类的时候,就从这些inputstream中获取某个类的字节码然后加载。这个维护的inputstream是针对原先旧jar包打开的输入流,如果这时

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值