字节码通过类加载器(ClassLoader)被加载进运行时数据区的方法区中
方法区:在内存中,存放class文件的逻辑结构,也就是类的元信息。包括常量池,类信息,字段,方法,属性等
方法区实现:JVM只是一个规范,所以方法去也只是一个规范,有不同的实现方式
在java8后的版本,被称为元空间,直接放在本地内存,所以理论上没有大小限制
Java的双亲委派模型
Android程序的双亲委派模型
public abstract class ClassLoader{
protected Class<?> findClass(String name) throws ClassNotFoundException{
throw new ClassNotFoundException(name);
}
....
/**
* 外部通过loadClass获得Class的实例
*/
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
// 已经被加载的类直接返回结果
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
//递归调用父类加载器的loadClass
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
return c;
}
}
Class的双亲委派模型有什么好处?
- 能够对类划分优先级层次关系
- 避免类的重复加载
- 沙箱安全机制,避免代码被篡改
为什么要打破双亲委派模型?
- 解决某些版本冲突问题
- 热部署(重复加载已经被加载的类)