java内存分析及类加载器学习
java内存分析及类加载器学习
内存分析
堆存放
1. 存放new的对象和数组
2. 可以被所有的线程共享,不会存放别的对象引用
栈存放
1. 存放基本变量类型(会包含这个基本类型的具体数值)
2. 引用对象的变量(会存放在这个引用在堆里面的具体地址)
方法区
1. 可以被所有的线程共享
2. 包含了所有的class和static变量
类加载器
类加载器的作用
类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口
类缓存:标准的javaSE类加载器可以按照要求查找类,但一旦某个类被加载到类加载器中,它将维持加载(缓存)一段时间,不过JVM垃圾回收机制可以回收这些Class对象
类加载器的种类
引导类加载器:用C++编写的,是JVM自带的类接在其,负责java平台核心类的加载(rt.jar里面的类),该加载器无法直接获取
扩展类加载器:负责jre/lib/ext目录下的jar或-D java.ext.dirs指定目录下的jar包装入工作库
系统类加载器:负责java -classpath或-D java.class.path所指的目录下的类与jar包装工作,是最常用的类加载器
//系统类加载器
ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
//扩展类加载器
ClassLoader parent = systemClassLoader.getParent();
//引导类加载器
ClassLoader parent1 = parent.getParent();
//自定义的类为系统类加载
Class c1= Class.forName("com.lwp.reflect.Test03");
System.out.println(c1.getClassLoader());
//rt.jar的类为引导类加载器加载
Class c2= Class.forName("java.lang.String");
System.out.println(c2.getClassLoader());
//查看系统类加载器可以加载的路径
System.out.println(System.getProperty("java.class.path"));
//双亲委派机制--》检测自定义的包类是否和jdk中重复,重复无效

浙公网安备 33010602011771号