首页 > 其他分享 >jvm Classload method介绍

jvm Classload method介绍

时间:2023-04-25 21:03:16浏览次数:44  
标签:name loadClass JVM findClass method Classload jvm class 加载


1,jvm Classload默认几个重要方法介绍
findClass:Finds and loads the class with the specified name from the URL search path.找到class文件并把字节码加载到内存中,如果自定义的加载器仅覆盖了findClass,而未覆盖loadClass(即加载规则一样,但加载路径不同);则调用getClass().getClassLoader()返回的仍然是AppClassLoader!因为真正load类的,还是AppClassLoader
defineClass:Converts an array of bytes into an instance of class. 创建类对象,将字节流解析成JVM能够识别的Class对象
loadClass:Loads the class with the specified binary name.自定义的加载器可以覆盖该方法loadClass(),以便定义不同的加载机制.例如Servlet中的WebappClassLoader覆盖了该方法,在WEB-INFO/classes目录下查找类文件;在加载时,如果成功,则缓存到ResourceEntry对象。——不同的加载机制。

2,其它一些方法
resolveClass:加载完字节码后,会根据需要进行验证、解析
defineClass:字节流解析成JVM能够识别的Class对象。不可覆盖
findLoadedClass:如果类已经加载过,则直接返回 Returns the class with the given name binary name if this loader has been recorded by the Java virtual machine as an initiating

3,调用规则:loadClass-->findClass-->defineClass--->resolveClass(可选)
4,JVM默认不能热部署类,因为加载类时会去调用findLoadedClass(),如果类已被加载,就不会再次加载。JVM判断类是否被加载有两个条件:完整类名是否一样、ClassLoader是否是同一个。



loadClass方法代码:
   

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }




标签:name,loadClass,JVM,findClass,method,Classload,jvm,class,加载
From: https://blog.51cto.com/u_16088628/6225143

相关文章

  • @JvmDefault is only supported since JVM target 1.8. Recompile with '-jvm-target
    问题Logcat提示’@JvmDefault’isonlysupportedsinceJVMtarget1.8.Recompilewith'-jvm-target1.8’解决在gradle中插入以下代码android{//..其他代码...kotlinOptions{jvmTarget="1.8"}}问题Logcat提示:Usageof‘@JvmDefault......
  • [Feign]feign.FeignException$MethodNotAllowed: [405] during [GET]
    一个服务调用另一个服务使用feign,但是报错:feign.FeignException$MethodNotAllowed:[405]during[GET] 原来是其中一个方法是get方法,但是因为feign的@RequestBody,会自动把Get请求变成Post,导致前后调用不一致报错。   解决方法:在pom文件中加上<dependency><groupId......
  • JVM调优笔记(一)--Nacos GC引发的服务批量下线问题
    故障背景线上批量发服务下线的告警邮件,偶发nacos连接超时。采用了springbootadmin(以下称sba)进行服务监控。原因分析因为sba服务是基于nacos对其它服务进行监控,所以遇到这个问题,第一怀疑对象是nacos发生问题,但不清楚具体是什么问题。由于服务过一段事件会恢复,所以nacos肯定是......
  • 从栈帧看字节码是如何在JVM中进行流转的
    从栈帧看字节码是如何在JVM中进行流转的我们都知道java文件需要编译成class文件,然后jvm负责加载并运行class文件,那么字节码文件长什么样子?字节码又是怎么执行的?工具介绍javapjavap是JDK自带的查看字节码的工具。javap的使用方法如下:$javacDemo.java$javap-p-vDemojavap命令......
  • jvm之强软弱虚引用
    强软弱虚引用在java中,除了基本数据类型的变量外,其他所有的变量都是引用类型,指向堆上各种不同的对象。在jvm中,除了我们常用的强引用外,还有软引用、弱引用、虚引用,这四种引用类型的生命周期与jvm的垃圾回收过程息息相关。那么这四种引用类型有什么区别?具体使用场景是什么?所有引用类型......
  • jvm之垃圾收集器
    垃圾收集器先看下图中HotSpot虚拟机所包含的收集器:图中展示了9种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。新生代收集器:Serial、ParNew、ParallelScavenge老年代收集器:CMS、SerialOld、......
  • jvm之垃圾回收算法
    垃圾回收算法哪些内存需要回收jvm的内存模型中将内存划分为程序计数器、虚拟机栈、本地方法栈、堆、方法区。其中程序计数器、虚拟机栈、本地方法栈属于线程私有的内存空间,与线程的生命周期保持一致,不需要手动回收内存。方法区中存放的是类的结构信息,对方法区的回收其实就是对类进......
  • jvm之线程上下文加载器与SPI
    线程上下文加载器线程上下文类加载器(ThreadContextClassLoader,简称TCCL)是从JDK1.2开始引入的。类java.lang.Thread中的方法getContextClassLoader()和setContextClassLoader(ClassLoadercl)用来获取和设置线程的上下文类加载器。如果没有通过setContextClassLoader(ClassLoader......
  • jvm如何打破双亲委托机制
    打破双亲委托机制重写父类ClassLoader的loadClass方法packagecom.morris.jvm.classloader;publicclassBreakDelegateClassLoaderextendsMyClassLoader{@OverrideprotectedClass<?>loadClass(Stringname,booleanresolve)throwsClassNotFoundException{......
  • JVM内存模型
    JVM内存模型JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。下图是jdk8jvm内存模型图:程序计数器程序计数器是当前线程所执行的字节码的行号指示器。JVM支持多个线程同时运行,每个线程都会根据CPU时间片来回切换,那么如果当前线程获得时间片了,怎么知道它......