JAVA内存模型

本文详细介绍了Java中的内存布局,包括程序计数器、局部变量表、操作数栈、动态连接和返回地址等部分的功能;解释了栈和堆的区别,以及它们如何存储局部变量和全局变量。此外还探讨了方法区的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  • 程序计数器:代码的行号,记录程序执行到的行号;
  • 局部变量表:存放局部变量;
  • 操作数栈:加、减、乘、除;
  • 动态连接:局部变量指向堆内的内存;
  • 返回地址:返回代码地址

内存

栈:

  1. 存放局部变量

  2. 不可以被多个线程共享

  3. 空间连续,速度快

堆:

  1. 存放对象
  2. 可以被多个线程共享
  3. 空间不连续,速度慢,但是灵活

方法区:

  1. 存放类的信息:代码、静态变量、字符串常量等等
  2. 可以被多个线程共享
  3. 空间不连续,速度慢,但是灵活

一、局部变量存储在方法栈中

在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统会释放方法栈,其对应在该方法中声明的变量随着栈的销毁而结束,这就局部变量只能在方法中有效的原因。在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。

​ (1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在JAVA虚拟机栈中

​ (2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在JAVA虚拟机的栈中,该变量所指向的对象是放在堆类存中的。

二、全局变量存储在堆中

在类中声明的变量是成员变量,也叫全局变量,放在堆中的(因为全局变量不会随着某个方法执行结束而销毁)。同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量

​ (1)当声明的是基本类型的变量其变量名及其值放在堆内存中的

​ (2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值