1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)。
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的) 。
5. 常量池:存放字符串常量和基本类型常量(public static final)。
1,栈 - 基本类型的变量和对象引用
数据可以共享。
栈中的数据大小和生命周期必须是确定的,当没有引用指向数据时,这个数据就会消失。
存取速度比堆要快。
2,堆 - 由new创建的对象实体和数组
运行时动态分配内存大小。
由java虚拟机自动垃圾回收器来管理。
3.强引用
当内存空间不足时,Java虚拟机宁愿抛出OOM错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
全局变量:
Object strongReference = new Object();
如果强引用对象不使用时,需要弱化从而使GC能够回收:
strongReference = null;
成员变量:
public void test() {
Object strongReference = new Object();
}
在一个方法的内部有一个强引用,这个引用保存在Java栈中,而真正的引用内容(Object)保存在Java堆中。
当这个方法运行完成后,就会退出方法栈,则引用对象的引用数为0,这个对象会被回收。
4.软引用
如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str);
注意:软引用对象是在jvm内存不够的时候才会被回收,我们调用System.gc()方法只是起通知作用,JVM什么时候扫描回收对象是JVM自己的状态决定的。就算扫描到软引用对象也不一定会回收它,只有内存不够的时候才会回收。
5.弱引用
垃圾回收器线程扫描过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
6.虚引用
任何时候都可能被垃圾回收器回收。
网友评论