java内存主要包括以下几个区域:
1、寄存器:我们在程序中无法控制
2、栈:保存基本类型的数据和对象的引用
在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中保存。当变量退出函数或代码块时,java会自动释放内存。
3、堆:存放用new产生的数据
堆内存用来存放new创建的对象和数组,是一个运行时数据区。该部分内存,由java虚拟机的自动垃圾回收器来管理。
栈中的某个变量(引用变量)保存数组或对象在堆内存中的首地址,然后可以使用这个引用变量来访问堆中的数组和变量。
栈中的变量在程序运行到作用于之外后被释放;堆中的变量在没有引用变量指向它的时候,等待java虚拟机来回收它。
4、常量池:存放常量
指在编译期被确定,并被保存在已编译的.class文件中的一些数据。
5、静态域:存放在对象中用static定义的静态成员
===============================================================================================================
字符串的内存分配:
字符串的引用都是存储在栈中,如果是编译器已经创建好的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals想到的字符串,在常量池中永远只有一份,在堆中有多份。
基础类型的变量和常量在内存中的分配:
基础类型的变量和引用都存储在栈中,常量存储在常量池中
成员变量和局部变量在内存中的分配:
局部变量的数据存于栈内存中,成员变量存储在对的对象里面。