美文网首页
Java堆栈和垃圾回收

Java堆栈和垃圾回收

作者: 举个小栗子0317 | 来源:发表于2021-04-27 13:18 被阅读0次

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.虚引用

任何时候都可能被垃圾回收器回收。

相关文章

网友评论

      本文标题:Java堆栈和垃圾回收

      本文链接:https://www.haomeiwen.com/subject/coderltx.html