IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java内存管理之堆和栈 -> 正文阅读

[Java知识库]Java内存管理之堆和栈

Java内存管理之堆和栈

我们都知道Java程序是运行在JVM(Java Virtual Machine)上的,我们可以把JVM理解成Java程序和操作系统之间的桥梁,而Java内存分配也都是基于JVM中进行的。
Java程序运行过程会涉及到两大重要的内存区域——堆和栈。

  • JVM会为每一个方法的调用在栈中分配一个对应的空间,这个空间称为该方法的栈帧,用于存储局部变量表、操作数、动态链接、方法出口信息等。
  • 当某一个方法调用完成后,其对应的栈帧将被清除。
  • 当栈内存储的内容是:
    1. 由基本数据类型声明的局部变量时,在栈中存储的是它们对应的具体数值。
    2. 局部对象的引用(定义在方法体中的引用类型变量),存储的是具体对象在堆中的地址。若对象的引用没有指向具体的空间,则是null。

  • 程序运行过程中动态产生的数据,比如new出来的对象,存放在堆中。
  • 当对象使用结束,并确定已无实例引用指向堆空间时,JVM才会依据相关垃圾回收机制进行资源回收,完成堆内资源释放。也就是说,并不是方法结束,方法内涉及到的堆空间就会立即释放,这也是与栈管理不同的地方。
  • 需要注意的是,创建出来的对象只包含属于各自的成员变量,并不包括成员方法。即同一个类的不同实例拥有各自的成员变量,存储在堆中的不同位置,但是同一个类的不同实例之间共享该类的方法,并不是每创建一个对象就把成员方法复制一次。

程序执行过程示例分析

public class Cat {
    // 成员属性:昵称、年龄
    String name;    // 昵称 String类型默认值为null
    int month;  // 年龄 int类型默认值为0
    
    // 成员方法:跑动
    public void run(double weight) {
        System.out.println("小猫已经" + weight + ",太重了,快去跑步");
    }
}
public class CatTest {
    public static void main(String[] args) {
        // 对象实例化
        Cat one = new Cat();
        double wh = 200;
        one.run(wh);
    }
}

以上两个类位于同一个包下,程序执行流程如下:

  1. JVM自动寻找main方法,执行第一句代码,创建一个Cat类的实例one,在栈中分配一块内存,存放一个指向堆区对象的地址。譬如0x111111。
  2. 创建一个double型的变量wh,由于是基本数据类型,直接在栈中存放double对应的值200。
    在这里插入图片描述
  3. 当调用one对象的run方法,并以wh为参数传入方法时,JVM检测到方法参数weight,作为方法局部变量,也会放入栈中,并将wh的值200复制给weight。
    在这里插入图片描述
  4. 当完成run方法调用后,立即释放局部变量weight所占用的栈空间。
    在这里插入图片描述
  5. main方法运行结束,立即释放栈中one,wh的空间,而堆中对象空间,则会当确定无引用指向该位置后,由垃圾回收机制进行回收,不会立即释放资源。
    在这里插入图片描述
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:04:04  更:2022-04-06 16:08:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:27:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码