1.虚拟机加载类的机制
虚拟机:执行class文件的,容器
概念:虚拟机将描述类的数据的class文件加载到内存,并将这些数据进行校验、转换、解析、初始化的过程,最终形成java虚拟机能使用的java类型的数据
什么时候加载类?
1.创建对象实例时
2.调用静态成员时(变量、方法)
3.创建子类对象
4.通过反射技术获取某个类型的Class对象时
当程序执行到某一行时,需要使用某个类,内存中没有这个类,需要加载这个类。
加载类的过程:
1。加载:
将class文件从硬盘中读取到内存中,并会为其创建一个Class对象。
每个类加载到内存中都会有一个Class对象。
2连接:
《1》校验类的内部结构是否正确,与之相关的类是否一致
《2》加载静态变量分配内存空间,并初始化
《3》将符号引用转化为直接引用
3初始化
2.类加载器
作用:将硬盘的class文件加载到内存中。
系统中有默认的加载器:
1.bootstrap classloder 引导(启动)类加载器 加载核心类库如:String\Integer…
2.extension classloader 扩展类加载器
加载扩展类,如java下的jdk\jre\lib\ext文件下的一些
3.application classloader 系统类加载器
加载java工具所执行的类
4.自定义加载器,需要继承ClassLoader
以上三个加载器是父子关系,最顶层是引导类加载器
bootstrap classloader
-------extension classloader
--------application classloaer
3.双亲委派加载机制:
如XXX.class加载时,先委派给系统类加载器,他不会加载,找父类扩展类加载器,它也不会加载,找引导类加载器,引导类加载器就会查找是否有该class文件,如果有加载,如果没有委派给扩展类加载器,以此类推,如果最终没有class文件,则会抛出类找不到异常(classnotfounderexception)。好处:不会重复加载class文件。
4.ClassLoad加载器,java.lang包中
java虚拟机在运行java程序的时候会把它管理的内存分成若干个不同的数据区域。java内存可以粗糙的区分为堆内存和栈内存,其中栈就是现在说的虚拟机栈,或者说虚拟机栈中局部变量表部分。
java创建对象的过程:
类加载检查 -> 分配内存 -> 初始化零值 ->设置对象头 ->执行init方法