49 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全

news/2024/7/5 8:49:25 标签: java, jhat, dump, jmap, mat

前言

呵呵 这是在之前 排查一个 flink 的相关问题的时候 发现的一个问题 

flink 默认的 job 隔离是基于 Classloader 来进行隔离的 

直到 最近才有时间来看一下 

这个问题的原因, 究其代码 也还是比较容易找到 

大致记录一下 

以下内容, 截图 基于 jdk8 

测试用例 

/**
 * Test27MultiClassInClassloader
 *
 * @author Jerry.X.He <970655147@qq.com>
 * @version 1.0
 * @date 2021-12-12 14:27
 */
public class Test27MultiClassInClassloader {

    // Test27MultiClassInClassloader
    public static void main(String[] args) throws Exception {

        List<Object> refs = new ArrayList<>();
        ClassLoader appClassloader = Test27MultiClassInClassloader.class.getClassLoader();
        URL[] classpath = new URL[]{
                new File("/Users/jerry/IdeaProjects/HelloWorld/target/classes").toURI().toURL()
        };
        String[] alwaysParentPattern = new String[]{};
        for (int i = 0; i < 10; i++) {
            ChildFirstClassLoader classLoader = new ChildFirstClassLoader(classpath, appClassloader, alwaysParentPattern);
            Class userClazz = classLoader.loadClass("com.hx.test12.Test27MultiClassInClassloaderUser");
            System.out.println(" the " + i + "th classloader " + Integer.toHexString(userClazz.hashCode()));
            Object userInstance = userClazz.newInstance();
            refs.add(userInstance);
        }

        System.in.read();

    }

}

运行时截图如下, 可以看到 多次 loadClass, 拿到的 java.lang.Class 分别是不同的 class, 会对应于多个 InstanceKlass, 多个 java.lang.Class 

保存一下 dump 文件, 然后使用 jhat 分析一下 

查询所有的 Class, 搜索一下 Test27MultiClassInClassloaderUser 只能搜索到一个 

并且只有一个 instance, 那么 其余九个 Test27MultiClassInClassloaderUser.class, 以及其对应的 instance 呢? 

问题的调试 

问题在于 jhat, showInstanceCounts/includePlatform 的处理基于读取出来的 dump 对应的 snapshot.classes 

然后我们看一下 解析的时候, 这个 classes 的存储 

是根据 全限定名 来作为 key 的, 因此 多个 classloader 加载的同一个 class 会被覆盖 

可以看到这里有一个 name, 如果是存在 多个相同的全限定名的情况下, 有一个额外的处理, 但是 为什么 最终传递给 classes 的还是 c.name 这个就不得而知了, 可能是存在一些更大的影响 

我们这里暂且使用 putInClassMap 中的 name 作为 key 来试试 

呵呵 小 case, 记录一下而已 

完 


http://www.niftyadmin.cn/n/11926.html

相关文章

MyBatis关联中进行(级联)查询的方法分享

转自: MyBatis关联中如何进行(级联)查询呢&#xff1f; 下文讲述使用MyBatis进行级联查询的操作示例分享 级联关系的简介 级联关系:是针对数据库的相关说明&#xff0c;目前有级联查询有三种: 一对一级联一对多级联多对多级联 如: 一个部门可分配给多个用户 也可以只将一…

shell脚本的条件判断2:文件属性的判断与比较

一 文件属性的判断与比较 Shell支持大量对文件属性的判断&#xff0c;常用的文件属性操作符很多&#xff0c;如下表所示。更多文件属性操作符可以参考命令帮助手册&#xff08;man test&#xff09;。 二 实例 实例&#xff1a;文件和目录判断 可以创建新的文件&#xff0c;…

【JVM技术专题】「原理专题」全流程分析Java对象的创建过程及内存布局

前言概要 对应过程则是&#xff1a;对象创建、对象内存布局、对象访问定位的三个过程。 对象的创建过程 对象的创建方式 java中对象的创建方式有很多种&#xff0c;常见的是通过new关键字和反射这两种方式来创建。除此之外&#xff0c;还有clone、反序列化等方式创建。 通过n…

NOIP 2022 游记

Day -8 CSP 回来半个月 loj 做题数猛涨 120&#xff0c;然而要说学会了什么似乎也没有。 耳机里都是初中时代的歌&#xff0c;疯狂怀念。 实验楼要装修&#xff0c;与 410 匆忙告别。 班级调坐&#xff0c;喜提单座。冥思苦想了半天原来有人提前去中科大了。后来又有人回了…

Java自幂数计算及其算法改进

文章目录1. 自幂数2.自幂数的个数3. 常规自幂数计算方法4.算法代码改进1. 自幂数 如果在一个固定的进制中&#xff0c;一个n位自然数等于自身各个数位上数字的n次幂之和&#xff0c;则称此数为自幂数。 例如&#xff1a;在十进制中&#xff0c;153是一个三位数&#xff0c;各个…

回归分析(1)-回归分析的基本概念

1.回归方程 由于x是可控的非随机变量&#xff0c; 而Y 是一个与x有关的随机变量&#xff0c;因此&#xff0c;直接研究变量Y与x之间的相关关系是困难的&#xff0e; 如果注意到随机变量Y的数学期望反映了随机变量Y的平均取值&#xff0c;因此&#xff0c; 可考虑研究EY与x之间的…

java计算机毕业设计高校迎新管理系统源码+mysql数据库+系统+lw文档+部署

java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署 java计算机毕业设计高校迎新管理系统源码mysql数据库系统lw文档部署本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&a…

Google Earth Engine(GEE)——样本点提取间隔距离500米提取样本点

假设您已经有了点,只想选择一个满足缓冲标准的子集。在这种情况下,您可以在随机图像上使用 reduceRegions 和最大缩减器,按细胞图像分组。 max reducer 将允许您指定额外的输入(例如:协变量或像素坐标)以携带它找到的任何最大值。 原有代码: var geometry = /* color:…