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中重复,重复无效
posted @ 2021-07-03 10:25  幸运刘  阅读(26)  评论(0)    收藏  举报