1. 常量池
常量池用于存放被Public static final
修饰的字段。
例如当我们创建常量时:例如Public static final String str = "something";
时,会在常量池存储"something"
。
常量池的优势是可以避免频繁的创建和销毁对象而影响性能,且在常量池中的变量实现了共享。
当在程序运行中执行String str = "abc"
时,不会在常量池存储新的abc
,而是首先检查常量池是否存在"abc"
,若存在,则在栈中创建String str
对象存储常量池中abc
的地址。
或者也可以使用String
类型的intern()
方法将其加入到常量池中。
2. 栈Stack
一般存放普通变量,一级缓存。
当在Java
中定义了一个变量后,Java
会在栈中为这个变量分配一个内存空间,当超过此变量的作用域后,Java
便会立即释放此内存。
3. 堆Heap
堆存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定。
堆内存用于存放由new
创建的对象和数组。在堆中分配内存,再由GC
管理。
当将方法中的对象或数组赋值给一个同类型变量时(不是重新new
),例如int[] newArray = oldArray
,oldArray
存在于堆中,而newArray
存在于栈中,newArray
存储的是oldArray
的堆内存首地址。
实现了变量共享。
4. 性能
寄存器 > 栈 > 堆 > 静态域 > 常量池 > 硬盘