JVM : 空间分配
当我们new 一个对象时,这个对象一定放在堆里面,堆中的这个对象是根据什么来创建的呢??(对象的结构,属性等等) 它会去索引找持久层方法区里面所对应的对象加载的类的信息,常量,静态变量,编译后的代码,这个是哪里来的呢 ?? 就是我之前文章里描述的 将磁盘二进制字节码迁移到内存中这一步。
a1 指引到堆中的方法区;
每调用一个方法,就会在方法栈里面压入对应的数据块(方法中所声明的所有形参,局部变量等等),每一个线程都有一个栈(绿色整块),可以看到一个栈最下面一层开始的是main函数开始,mian method1 method2 都属于JVM方法栈。
JVM方法栈
- 存储方法调用时的局部变量的临时空间。
- 栈帧:方法调用时分配空间并入栈,方法调用结束后出栈,编译期计算大小空间。
对象空间
- 存储所有对象
- 空间动态分配
- 垃圾回收主要作用的空间
持久层
- 类信息,常量,静态变量,方法代码空间
- 固定不变,JVM启动就分配,JVM退出则销毁
栈空间每个线程独立,堆中数据为每个线程共享(所以就产生了数据一致性问题)