Java中的堆、栈和方法区
栈
栈区主要存放的是临时变量、对象和数组的引用(即地址)。当定义一个变量时,java就在这个栈中为变量分配内存空间,当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放;
堆
堆区主要存放的是new出来的对象和数组,以及类中非静态成员变量。当我们new一个对象出来时,java就在堆中为这个对象分配内存空间,而其对象在堆中的地址就是该对象的引用变量,存放在栈区,之后就可以在程序中使用栈区的引用变量来访问堆区的这个对象了,引用变量相当于给对象起的一个别名。当我们把该对象的所有引用变量在栈区都删除时,jvm的垃圾回收器就会将该对象在堆区释放掉。
常量池
常量池是方法区的一部分内存。常量池是在编译期间就将一部分数据存放于该区域,包含基本数据类型以final声明的常量值。
静态域
位于方法区的一块内存。存放类中以static声明的静态成员变量。
方法区
是各线程共享的内存区域,用于存储class二进制文件,包含了虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。它有个名字叫Non-Heap(非堆),目的是与java堆区区分开。