一、什么是双亲委派模式?有什么作用?
当某个类加载器需要加载某个.class文件的时候,它首先会把这个任务委托给他的上级类加载器,去递归这个操作,如果说上级的类加载器没有去加载,自己才会去加载这个类的
1.BootstrapClassLoader(启动类加载器):c++中编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于呢引导类加载器涉及到了虚拟机本地实现的一些细节,开发者是无法直接获取到启动类加载器的引用的,所以就也是不允许直接通过引用进行操作的。
2.ExtClassLoader(标准扩展类加载器):java编写的,加载扩展库,例如classpath中的jre ,javax.*或者java.ext.dir指定位置中的类,开发者是可以直接使用标准扩展类加载器的。
3.AppClassLoader(系统类加载器):java编写的,加载程序所在的目录,如user.dir所在的位置的class。
4.CustomClassLoader(用户自定义类加载器):java编写的,用户自定义的类加载器,可加载指定路径的class文件。
作用:可以去防止重复加载同一个.class。通过委托去向上级问一问,如果加载过了,就不用再加载一遍了。保证了数据的安全性。保证核心的.class不能被篡改掉。我们通过委托的方式,就不会去篡改核心.class了,即使是篡改也不会去加载了哦,然后即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也将不是同一个Class对象了。这样就保证了Class执行的安全。
二、什么是内存溢出, 内存泄露? 他们的区别是什么?
1.内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
2.内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。就是指你向系统申请分配内存进行使用(new) ,可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序
区别:一个是内存不足,一个是用完不还,所以系统再不会给你分配