1. Class文件加载流程
在java中,类装载器把一个类装载到java虚拟机中,经过装载,链接和初始化;链接又包括校验,准备和
解析。必须严格按照顺序执行的。
装载:查找和导入类和接口的二进制数据(.class文件)
链接:执行校验,准备和解析(可选)
校验:检查导入类和接口数据的正确性
准备:给类的静态变量分配内存并将其初始化默认值
解析:将符号引用转换成直接引用
初始化:调用java代码,初始化类的静态变量(把类变量初始化正确初始值)和静态java代码块
2. 变量初始化
变量可以分为局部变量和全局变量,全局变量又分为实例变量和类变量(static静态变量);
局部变量一般是在方法内部的变量,由于其作用域在方法的内部有效,所以线程是安全的; 不能由public,private ,protected,等修饰;也不能由static修饰。
类变量如果用public修饰,则其作用域是全局的,如果用private修饰则其作用域只在类的内部。一般方法和静态方法跟局部变量和静态变量的关系一样。
栈--长度固定,由编译器自动释放;
堆--数据长度不固定,动态分配,垃圾回收器(gc)可以回收;
全局区(也叫静态区)--存放静态变量和全局变量;
类的静态变量在内存中只有一个,在java虚拟机叫做类的过程中位静态变量分配内存,静态变量位于方法去,被类的所有实例共享。器生命周期取决于类的生命周期。
实例变量取决于类的实例,当创建一个实例时,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区,不一定连续的空间。
局部变量在方法内部或者某些循环中,执行到她的时候直接在栈中开辟内存并使用。当局部变量脱离作用域,则释放内存,局部变量必须手工初始化。
局部变量位于栈区,静态变量位于方法区,实例变量位于堆区,方法的字节码位于方法区,对象本身位于堆区,对象的引用位于栈区
一个class文件是由类加载器加载进来的以后.class文件被加载进来以后放在方法区。
方法本身作为指令的操作码部分,保存在stack中,方法内部变量作为指令的操作数部分,跟在指令的操作码后,保存在stack中。
对象实例及其属性值保存在堆中。