Java堆栈和垃圾回收

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

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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java中变量、对象的存储位置 Java内存分配时涉及5个区域,分别是寄存器、栈(stack)、堆(heap)、常...
    于阗阅读 468评论 0赞 1
  • 1 JVM栈 (Java Virtual Machine Stacks) 在介绍JVM栈之前,我先了解一下 栈帧 ...
    轝巐阅读 5,152评论 0赞 2
  • Java堆栈 Java把内存划分为两种:一种是堆,一种是栈。 栈 存放一些基本类型的变量和对象的引用变量。java...
    Mrrr_K阅读 1,137评论 1赞 2
  • 栈区:每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),...
    沉淀之际阅读 159评论 0赞 0
  • 最近在看JAVA虚拟机规范,谈下自己对java堆栈的理解 java虚拟机内存分为:栈、本地方法栈、堆、程序计数器、...
    HopeMan阅读 1,463评论 0赞 0

友情链接更多精彩内容