JAVA堆区栈区方法区理解
java内存空间的理解
堆
JVM只有一个堆区,所有线程共享,堆区主要存放java运行过程中new出来的对象,对于堆中的对象的生命周期管理由java虚拟机的JVM的垃圾回收机制GC进行回收和管理,类的非静态成员变量也存放在堆中,其中基本数据类型直接保存值,引用数据类型保存引用地址,非静态成员变量可以在类的实例化时开辟空间并初始化。
栈
每个线程都有一个栈区,栈区主要存放运行期间的一些局部变量,因为方法执行时,被分配的内存就在栈中,故局部变量在栈中,当一段代码执行完毕,栈中所占内存立即释放。
方法区
JVM只有一个方法区所有进程公用一个方法区,方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
类的加载时机
类从被加载到虚拟机内存中,到卸载出内存为止,其生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)、7个阶段,其中验证、准备、解析3个部分统称为连接(Linking),7个阶段发生顺序如图所示:
类的加载机制是将类的.class文件加载到内存中,将其放在运行时的数据区内的方法区内,然后在堆区创建java.lang.Class对象,用来封装类在方法区中的数据结构,类加载的最终产品是位于堆区的对象,class对象封装了位于方法区的数据结构。
类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误)如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误
加载
查找并加载类的二进制数据,虚拟机要完成一下几个步骤:
1.通过一个类的全限定名来获取一个来获取二进制字节流。
2.将这个字节流所代表的静态存储结构转成方法区运行时的数据结构
3.在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区中对这些数据的访问入口
连接
验证