java体系结构
方法区(Method Area),堆(heap),Java栈(java stack),本地方法栈(Native Method Stack),程序计数器(Program Counter Register)
方法区(Method Area),堆(heap) --> GC的作用区域
ClassLoader(类加载机制)作用
Java 程序在运行的时候,JVM通过类加载机制(Class Loader)把class文件加载到内存中,只有class文件被载入内存,才能被其他class引用,使程序正常的运行起来。
ClassLoader的分类
Java中的ClassLoader有三种:Bootstrap ClassLoader 、Extension ClassLoader、App ClassLoader。
1. Bootstrap ClassLoader
由C++写的,由JVM启动.
启动类加载器,负责加载java基础类,对应的文件是%JRE_HOME/lib/ 目录下的rt.jar、resources.jar、charsets.jar和class等
2.Extension ClassLoader
Java类,继承自URLClassLoader 扩展类加载器,
对应的文件是 %JRE_HOME/lib/ext 目录下的jar和class等
3.App ClassLoader
Java类,继承自URLClassLoader 系统类加载器,
对应的文件是应用程序classpath目录下的所有jar和class等
ClassLoader的加载机制
Java的加载机制是双亲委派机制来加载类,
为什么要使用这种方式?这个是为了保证 如果加载的类是一个系统类,那么会优先由Bootstrap ClassLoader 、Extension ClassLoader先去加载,而不是使用我们自定义的ClassLoader去加载,保证系统的安全!
这三种类加载器存在父子关系,App ClassLoader的父类加载器是Extension ClassLoader,Extension ClassLoader的父类加载器是Bootstrap ClassLoader,要注意的一点是,这里的父子并不是继承关系.
当这三者中的某个ClassLoader要加载一个类时,会先委托它的父类加载器尝试加载,一直往上,如果最顶级的父类加载器没有找到该类,那么委托者则亲自到特定的地方加载
自定义ClassLoader
1、为什么要自定义ClassLoader
因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader.
而且我们可以根据自己的需求,对class文件进行加密和解密。
2.如何自定义ClassLoader
2.1
新建一个类继承自java.lang.ClassLoader,重写它的findClass方法。
2.2
将class字节码数组转换为Class类的实例
2.3
调用loadClass方法即可
双亲委派机制的作用
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。 2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
常用GC算法
标记清除,标记压缩,复制;
复制算法的缺点:
1.不适用于存活率高的情况,因为需要将所有存活对象都复制一遍,并将所有引用地址重置一遍,浪费时间。
2、from和to同一时刻只能有一个在装了东西,另外一块内存区域一定为空
标记清除(Mark-Sweep)(用于老年代)没有拷贝,所以空间不浪费但是会扫描两次(标记一次、清除一次),耗时严重、内存空间不连续,有内存碎片,再想去找连续空间就不好找了
标记压缩(Mark-Compact)(标记清除+整理)(用于老年代)没有内存碎片、可以腾出连续空闲的内存空间唯一缺点:效率不高,移动对象需要耗费更多时间(是四个算法中耗时最长的)