程序运行内存状态
栈是一种数据结构,而堆是用来动态分配内存的
内存中的对象
程序在运行时,一些内存空间分配给了数据,这个数据在空间逻辑上分为两个部分,堆和栈.基本类型分配在栈中,Java 对象分配在堆中
//把一些字节分配给了引用变量 book, book 的初始值为null,因为还没有对象赋给它
Book book;
//此行代码会创建一个Book的实例,存储在堆中,并将这个实例的地址赋给引用变量 book
book = new Book();
加载,连接和初始化
jvm执行一个类会发生什么情况
1.加载: jvm将java类的二进制形式加载到内存中(.class文件)
(并可以将它缓存在内存中,以便将来再次调用,如果没有找到将会引发 ClassNotFoundException)
2.连接: 在这个阶段会做三件事:验证,准备,解析(可选)
2.1验证: jvm根据java编程语言和jvm的语义要求检查这个二进制形式
2.2准备: 准备要执行的指定的类,这包含给这个类的静态变量和其他数据分配内存空间
2.3.解析: 检查制定类是否引用了其他类/接口,能否找到和加载其他的类/接口,这些检查将针对被引用的类/接口递归执行
解析可以在后面执行,真正被引用的时候进行解析
3.初始化: jvm用赋值或缺省值来将