----------------------------------------------------------------------------------以上摘自JAVA内存管理 -----------------------------------------------------------------------------------------------------
JVM将申请到的内存分为三个部分,分别是栈(stack)、堆(heap)和方法区(method aera)。
stack存取速度最快,仅次于位于CPU中的寄存器(近水楼台自然更快),它的存取过程遵循LIFO(后进先出)原则,负责存储代码中基本类型变量和引用类型变量。当在一段代码块定义一个变量时,Java 就在stack中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作他用。正因为如此,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
heap个线程共享,存取速度次于stack,其存储空间可以通过new进行分配,所以使用new产生的对象类型变量是存储在heap中的。即使代码运行超出了new所在的代码块,heap中的对象类型变量空间也不会被立即被释放,只有在没有引用类型变量指向对象类型变量时,改对象才会变成“垃圾”,在之后的某个不确定的时间上被JVM的垃圾回收器清理,并释放其所占用的存储空间。
method aera是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,保存类的结构(属性和方法)、常量、静态变量、即时编译器编译后的代码等数据。常量池位于该区。