首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Throwable's Blog

    线程上下文类加载器ContextClassLoader内存泄漏隐患

    线程中的ContextClassLoader ContextClassLoader其实指的是线程类java.lang.Thread中的contextClassLoader属性,它是ClassLoader = parent.getContextClassLoader(); else this.contextClassLoader = parent.contextClassLoader ()); } return contextClassLoader; } 首先明确两点: Thread实例允许手动设置contextClassLoader属性,覆盖当前的线程上下文类加载器实例 ,那么新建的后代线程的contextClassLoader就是应用类加载器。 ContextClassLoader设置不当导致内存泄漏的隐患 只要有大量热加载和卸载动态类的场景,就需要警惕后代线程ContextClassLoader设置不当导致内存泄漏。

    1K10发布于 2020-06-23
  • 来自专栏码匠的流水账

    聊聊dubbo的ClassLoaderFilter

    ,然后将其ContextClassLoader设置为invoker.getInterface().getClassLoader(),之后执行invoker.invoke方法,最后将当前线程的classLoader 重置为原来的contextClassLoader 实例 dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter getContextClassLoader()为加载DemoService.class的URLClassLoader 小结 ClassLoaderFilter实现了Filter接口,其invoke方法首先获取当前线程的contextClassLoader ,然后将其ContextClassLoader设置为invoker.getInterface().getClassLoader(),之后执行invoker.invoke方法,最后将当前线程的classLoader 重置为原来的contextClassLoader doc ClassLoaderFilter

    82320发布于 2019-06-29
  • 来自专栏码洞

    老大难的 Java ClassLoader,到了该彻底理解它的时候了

    private ClassLoader contextClassLoader; public ClassLoader getContextClassLoader() { return contextClassLoader ... } contextClassLoader「线程上下文类加载器」,这究竟是什么东西? 这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader。 那这个 contextClassLoader 究竟是做什么用的? 它可以做到跨线程共享类,只要它们共享同一个 contextClassLoader。父子线程之间会自动传递 contextClassLoader,所以共享起来将是自动化的。 如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,就可以很好的起到隔离保护的作用

    1K30发布于 2018-12-21
  • 来自专栏码匠的流水账

    聊聊dubbo的ClassLoaderFilter

    ,然后将其ContextClassLoader设置为invoker.getInterface().getClassLoader(),之后执行invoker.invoke方法,最后将当前线程的classLoader 重置为原来的contextClassLoader 实例 dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/filter getContextClassLoader()为加载DemoService.class的URLClassLoader 小结 ClassLoaderFilter实现了Filter接口,其invoke方法首先获取当前线程的contextClassLoader ,然后将其ContextClassLoader设置为invoker.getInterface().getClassLoader(),之后执行invoker.invoke方法,最后将当前线程的classLoader 重置为原来的contextClassLoader doc ClassLoaderFilter

    39020发布于 2019-07-10
  • 来自专栏Java架构师进阶

    揭秘java中无数人伤透脑筋最为神秘的技术之一——ClassLoader

    (ClassLoader cl){this.contextClassLoader = cl; } ... } contextClassLoader「线程上下文类加载器」,这究竟是什么东西? 那些因为代码上的依赖关系而懒惰加载的类也不会自动使用 contextClassLoader来加载。 这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader。 那这个 contextClassLoader 究竟是做什么用的? 它可以做到跨线程共享类,只要它们共享同一个 contextClassLoader。父子线程之间会自动传递 contextClassLoader,所以共享起来将是自动化的。 如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,就可以很好的起到隔离保护的作用

    61620发布于 2019-10-14
  • 来自专栏全栈程序员必看

    类加载器的方法_JS加载器

    > c1 = contextClassLoader.loadClass("com.tech.load.def.UserImpl"); // c1.newInstance(); //classloader.loadClass 不会触发初始化,当创建对象时执行初始化,执行静态程序块内容 输出 "UserImpl init ..." // ClassLoader contextClassLoader1 = Thread.currentThread > c2 = contextClassLoader1.loadClass("com.tech.load.def.UserImpl"); // c2.newInstance(); //使用相同的类加载器 ==contextClassLoader1); //true 获取的上下文类加载器是同一个类加载器 // System.out.println(c1==c2); // true 同一个类加载器器 = Thread.currentThread().getContextClassLoader(); System.out.println(classLoader==contextClassLoader

    7.6K10编辑于 2022-10-04
  • 来自专栏张师傅的博客

    一次 Dubbo 线程上下文类加载器的疑难杂症分析

    这里的 ClassFactory 创建的时候传入的 classloader 是当前线程的 ContextClassLoader。 确实不知为何被设置为了sun.misc.Launcher$AppClassLoader,然后看更多日志,发现除了这个线程其它的 DubboServerHandler 线程的 ContextClassLoader 因为 DubboServerHandler-172.30.86.136-thread-2 这个线程的 ContextClassLoader 是 sun.misc.LauncherAppClassLoader 为了弄清楚这个问题,需要一点点 Java ContextClassLoader 的知识。 线程上下文类加载器由继承自父线程。如果父线程没有设置上下文类加载器,则线程将继承类加载器的默认实现。 = parent.getContextClassLoader(); else this.contextClassLoader = parent.contextClassLoader

    1.2K10编辑于 2023-03-03
  • 来自专栏博岩Java大讲堂

    Java日志体系(commons-logging)Java日志系统学习

    getFactory() throws LogConfigurationException { //获取当前线程的classCloader: ClassLoader contextClassLoader = getContextClassLoaderInternal(); if (contextClassLoader == null) { ..... //读取classpath下的commons-logging.properties文件: Properties props = getConfigurationFile(contextClassLoader , FACTORY_PROPERTIES); ClassLoader baseClassLoader = contextClassLoader; if (props ! = null) { // 将日志工厂添加到缓存当中: cacheFactory(contextClassLoader, factory);

    2.8K50发布于 2018-05-11
  • 来自专栏大前端

    Java ClassLoader 透析

    private ClassLoader contextClassLoader; public ClassLoader getContextClassLoader() { return contextClassLoader ... } contextClassLoader「线程上下文类加载器」,这究竟是什么东西? 这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader。 那这个 contextClassLoader 究竟是做什么用的? 它可以做到跨线程共享类,只要它们共享同一个 contextClassLoader。父子线程之间会自动传递 contextClassLoader,所以共享起来将是自动化的。 如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,就可以很好的起到隔离保护的作用

    66820发布于 2019-04-11
  • 来自专栏芋道源码1024

    老大难的 Java ClassLoader 再不理解就老了

    private ClassLoader contextClassLoader; public ClassLoader getContextClassLoader() { return contextClassLoader ... } contextClassLoader「线程上下文类加载器」,这究竟是什么东西? 这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader。 那这个 contextClassLoader 究竟是做什么用的? 它可以做到跨线程共享类,只要它们共享同一个 contextClassLoader。父子线程之间会自动传递 contextClassLoader,所以共享起来将是自动化的。 如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,就可以很好的起到隔离保护的作用

    1.2K20发布于 2019-10-29
  • 来自专栏Panda诚

    Java类加载器

    private ClassLoader contextClassLoader; public ClassLoader getContextClassLoader() { return contextClassLoader 程序启动时的 main 线程的 contextClassLoader 就是 AppClassLoader。 这意味着如果没有人工去设置,那么所有的线程的 contextClassLoader 都是 AppClassLoader。 如果我们对业务进行划分,不同的业务使用不同的线程池,线程池内部共享同一个 contextClassLoader,线程池之间使用不同的 contextClassLoader,显示的使用contextClassLoader 去加载类,就可以很好的起到隔离保护的作用,避免类版本冲突,当热线程的 contextClassLoader 使用场合比较罕见。

    1.1K31发布于 2020-09-01
  • 来自专栏码代码的陈同学

    Java基础之SPI机制

    欢迎访问陈同学博客原文 在前几天的译文 Java中的类加载器 中有部分关于ContextClassLoader的内容,涉及到SPI机制,本文将学习下相关知识。 什么是SPI? ContextClassLoader 类加载规则中有这么一点:一个类中所关联的其他类都由当前类的加载器进行加载。 为了解决这个问题,提出了 ContextClassLoader 概念,绕开委派原则,既然当前的加载器是Bootstrap class loader,导致无法加载FabricMySQLDriver类,那就变更当前的 = cl; } contextClassLoader 取名也很有趣,当前线程的 context ClassLoader。 /* The context ClassLoader for this thread */ private ClassLoader contextClassLoader; 小结 BB这么多,SPI其实非常简单

    79620发布于 2018-08-23
  • 来自专栏vivo互联网技术

    Tomcat 应用中并行流带来的类加载问题

    因此当前的线程contextClassLoader应该和创建此线程的父线程保持一致才对,不应该是null啊? 环境下,7.0.74 版本之后的 Tomcat 会默认将 SafeForkJoinWorkerThreadFactory 作为 ForkJoinWorkerThread 的创建工厂,同时将该线程的 contextClassLoader 至此,_loader为空的问题已经清楚,但是Tomcat为什么要多此一举,将null作为这个 ForkJoinWorkerThread的contextClassLoader呢? 3、contextClassLoader内存泄露之谜 在JDK1.2以后,类加载器的双亲委派模型被广泛引入。 都指定为ForkJoinPool.class.getClassLoader(),而不是JDK默认的继承父线程的contextClassLoader,进而避免了Tomcat应用中由并行流带来的类加载器内存泄露

    1.8K01发布于 2019-09-23
  • 来自专栏冰河技术

    高并发之——深入解析Callable接口

    ClassLoader ccl; 接下来,通过构造方法注入Callable对象,在构造方法中,首先获取系统安全管理器对象实例,通过系统安全管理器对象实例检查是否具有获取ClassLoader和设置ContextClassLoader 具体执行逻辑为:在PrivilegedExceptionAction对象的run()方法中获取当前线程的ContextClassLoader对象,如果在构造方法中获取的ClassLoader对象与此处的 ContextClassLoader对象是同一个对象(不止对象实例相同,而且内存地址也相同),则直接调用Callable对象的call()方法返回结果。 否则,将PrivilegedExceptionAction对象的run()方法中的当前线程的ContextClassLoader设置为在构造方法中获取的类加载器对象,接下来,再调用Callable对象的 最终将当前线程的ContextClassLoader重置为之前的ContextClassLoader

    55220发布于 2020-10-29
  • 来自专栏wannshan(javaer,RPC)

    java ThreadLocal 分析by 源码

    parent.getPriority(); if (security == null || isCCLOverridden(parent.getClass())) this.contextClassLoader = parent.getContextClassLoader(); else this.contextClassLoader = parent.contextClassLoader

    48930发布于 2021-03-18
  • 来自专栏悠扬前奏的博客

    Java并发-8.线程的构造启动,中断,完成

    parent.getPriority(); if (security == null || isCCLOverridden(parent.getClass())) this.contextClassLoader = parent.getContextClassLoader(); else this.contextClassLoader = parent.contextClassLoader

    65520发布于 2019-05-28
  • 来自专栏RPC

    不是单例的单例——巧用ClassLoader

    备用 ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); //设置当前线程的 ContextClassLoader 还原为初始的 contextClassLoader Thread.currentThread().setContextClassLoader(contextClassLoader); //通过反射获取该类的 可以通过如下的代码来获取当前线程的 ContextClassLoader : ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader 备用 ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); //设置当前线程的 ContextClassLoader 还原为初始的 contextClassLoader Thread.currentThread().setContextClassLoader(contextClassLoader); Tomcat类加载模型

    66020编辑于 2023-05-15
  • 来自专栏single云社区

    【Java——SPI机制详解】

    throws LogConfigurationException { // Identify the class loader we will be using ClassLoader contextClassLoader = getContextClassLoaderInternal(); if (contextClassLoader == null) { // This is an odd enough )); logHierarchy("[LOOKUP] ", contextClassLoader); } // Load properties file. // / factory = newFactory(FACTORY_DEFAULT, thisClassLoader, contextClassLoader); } if (factory ! . */ cacheFactory(contextClassLoader, factory); if (props !

    3.1K00编辑于 2024-05-31
  • 来自专栏冰河技术

    一个Callable接口能有多少知识点?

    ClassLoader ccl; 接下来,通过构造方法注入Callable对象,在构造方法中,首先获取系统安全管理器对象实例,通过系统安全管理器对象实例检查是否具有获取ClassLoader和设置ContextClassLoader 具体执行逻辑为:在PrivilegedExceptionAction对象的run()方法中获取当前线程的ContextClassLoader对象,如果在构造方法中获取的ClassLoader对象与此处的 ContextClassLoader对象是同一个对象(不止对象实例相同,而且内存地址也相同),则直接调用Callable对象的call()方法返回结果。 否则,将PrivilegedExceptionAction对象的run()方法中的当前线程的ContextClassLoader设置为在构造方法中获取的类加载器对象,接下来,再调用Callable对象的 最终将当前线程的ContextClassLoader重置为之前的ContextClassLoader

    35920编辑于 2022-02-08
  • 来自专栏Java快速进阶通道

    使用CompletableFuture时,那些令人头疼的问题

    new Thread创建线程源码发现有如下代码 if (security == null || isCCLOverridden(parent.getClass())) this.contextClassLoader = parent.getContextClassLoader(); else this.contextClassLoader = parent.contextClassLoader java.util.concurrent.ForkJoinPool的类加载器,而此类位于rt.jar包下,那它的类加载器自然就是BootStrapClassLoader了 问题解决 解决方式一: ClassLoader contextClassLoader task1 = CompletableFuture.runAsync(() -> { Thread.currentThread().setContextClassLoader(contextClassLoader

    4.3K00发布于 2020-12-28
领券