• ClassLoader类加载器浅见


    类加载器

    类加载器,它拿到.class文件,它会把他拆成两部分,将static数据转换成方法区的数据结构,然后把他放在了方法区之中。
    然后在堆里面建一个类对象(Class,它可以用来实例化对象),然后可以通过这个类对象找到位于方法区的static数据。、
    注意:访问对象是从栈去找,然后在从访问对象,而这个堆分为两部分(堆,方法区(特殊的堆)).

    • package Reflection;
      public class Test05 {
          public static void main(String[] args) throws ClassNotFoundException {
              //获取系统类加载器
              ClassLoader systemClassLoader =ClassLoader.getSystemClassLoader();
              System.out.println (systemClassLoader);
              //测试父类加载器(Extention ClassLoader)
              ClassLoader parent = systemClassLoader.getParent ();
              System.out.println (parent);
              //扩展类加载器父类加载器,根(引导类)加载器,这个用户是获取不到的,最高一层
              ClassLoader gradepa = parent.getParent ();
              System.out.println (gradepa);
              //测试当前类是哪个加载器加载的
              ClassLoader classLoader = Class.forName ("Reflection.Test05").getClassLoader ();
              System.out.println (classLoader);
              //测试JDK内部类是由谁加载的,Object是最高级的了,创建它的类就是引导类加载器,也是不允许获取的
              classLoader = Class.forName ("java.lang.Object").getClassLoader ();
              System.out.println (classLoader);
              //获取java的扩展类
              System.out.println (System.getProperty("java.class.path"));
          }
      }
      结果:
          sun.misc.Launcher$AppClassLoader@dad5dc
          sun.misc.Launcher$ExtClassLoader@16d3586
          null
          sun.misc.Launcher$AppClassLoader@dad5dc
          null
          C:jdkjrelibcharsets.jar;C:jdkjrelibdeploy.jar;C:jdkjrelibextaccess-bridge.jar;C:jdkjrelibextcldrdata.jar;C:jdkjrelibextdnsns.jar;C:jdkjrelibextjaccess.jar;C:jdkjrelibextjfxrt.jar;C:jdkjrelibextlocaledata.jar;C:jdkjrelibext
      ashorn.jar;C:jdkjrelibextsunec.jar;C:jdkjrelibextsunjce_provider.jar;C:jdkjrelibextsunmscapi.jar;C:jdkjrelibextsunpkcs11.jar;C:jdkjrelibextzipfs.jar;C:jdkjrelibjavaws.jar;C:jdkjrelibjce.jar;C:jdkjrelibjfr.jar;C:jdkjrelibjfxswt.jar;C:jdkjrelibjsse.jar;C:jdkjrelibmanagement-agent.jar;C:jdkjrelibplugin.jar;C:jdkjrelib
      esources.jar;
      C:jdkjrelib
      t.jar;
      D:projectJavaTest2outproductionJavaTest2;C:Program FilesJetBrainsIntelliJ IDEA 2019.3.1libidea_rt.jar
      
      
      

    class对象在堆里面。对象一般都比较大,所以全放在堆里面(堆相当于一本书的内容部分)
    自问自答:
    类缓存?
    顾名思义,就是一个类如果被放倒类加载器中,加载完了之后,还会保留一段时间。
    类加载器分类?分三类(引导区加载器,扩展类加载器,系统类加载器),层次由高到底
    测试当前类是哪个加载器加载的,测试JDK内置的类是由谁加载的,如何获得类加载器的加载路径?
    ClassLoader返回的是一串字符串,先用ClassLoader.getSystemClassLoader可以获取系统类加载器,然后通过getParent()再往上获取。
    双亲委派机制(就是优先启用系统原有的jar包,你写的就算一模一样他也不用。)!

    类加载内存分析

    public class Test03 {
        public static void main(String[] args) {
            A a = new A ();
            System.out.println (a.m);
        }
    }
    class A{
        static{
            m = 300;
            System.out.println ("静态方法在讲话,当前的m"+A.m);
        }
        static int m = 100;
        public A() {
            System.out.println ("构造方法启动了,当前的m"+m);
        }
    }
    结果:
        静态方法在讲话,当前的m=300
        构造方法启动了,当前的m=100
        100
    

  • 相关阅读:
    【Android 7.1.1】 锁屏界面点击“空白处”响应事件
    ubuntu14.04 LTS Visual Studio Code 编辑器推荐
    使用MAT分析Java内存
    Android 性能优化:使用 Lint 优化代码、去除多余资源
    Android 内存使用hprof文件打开方法
    使用Android Studio调试内存问题
    使用新版Android Studio检测内存泄露和性能
    Android性能优化篇 [ 谷歌官方 ]
    Android 内存泄露总结(附内存检测工具)
    Android MemInfo 各项的意义(转)
  • 原文地址:https://www.cnblogs.com/li33/p/12726930.html
Copyright © 2020-2023  润新知