jvm栈

本文深入探讨了计算机内存中栈和堆的区别,特别是在处理基本数据类型和对象引用时的不同方式。详细解释了栈如何存储基本数据类型及其效率,以及堆如何通过对象引用处理更复杂的数据结构,包括字符串实例化时的特殊行为。

栈存放内容

1.基本数据类型

类似于  key : value   ,

int a= 3;

直接在栈内 写入  a   与   3,  因为基本数据类型大小较小,所以比较高效,

注意

如果声明的值一致

类似 int a=3, b=3;

此时a与b还是相互独立的。

 

2.对象引用

不是基本数据类型了, 是一个对象(Object) 引用 (reference)

对象需要实例化, new, 需要占用地址, 这个地址在  堆  里

所以栈里存放的是  对象引用

eg:

String a=new String("abc")

那么栈里存放的是  a  与  指向 "abc"的引用, 可能是地址,可能是句柄

注意

如果不使用关键字new

eg:

String a="123";

String b="123"

声明b时,就不会再在堆里重新申请对象了

这时, 栈里 a 与 b  的引用值相同, 都指向同一个对象

a==b为true

 

如果

String a=new String ("123")

String b=new String ("123")

这时,栈里 a 与 b的引用 就不同了

所以a==b  为false

### JVM 的类型及其特点 JVM Java 虚拟机中用于管理程序运行时数据的重要结构,主要包括以下几种类型:**虚拟机Java Virtual Machine Stack)**、**本地方法(Native Method Stack)** 和 **操作数(Operand Stack)**。它们各自承担不同的职责,并具有不同的特点。 #### 虚拟机 虚拟机用于管理 Java 方法的调用,每个线程在创建时都会创建一个虚拟机,其内部由多个**帧(Stack Frame)**组成,每个帧对应一个方法的调用。帧中存储了局部变量表、操作数、动态链接、方法出口等信息。虚拟机是线程私有的,生命周期与线程一致。它主要负责程序的运行控制,包括方法的调用与返回[^2]。 虚拟机的访问速度非常快,仅次于程序计数器(PC Register),是 JVM 中最常用的运行时内存结构之一。它支持基本数据类型的局部变量和对象引用的存储。由于基于的设计,Java 的指令集较小,编译器容易实现,但相比基于寄存器的架构,性能会有所下降[^2]。 #### 本地方法 本地方法用于管理本地方法(Native Method)的调用,这些方法通常使用 C 或 C++ 实现。与虚拟机类似,本地方法也是线程私有的,允许被实现为固定大小或动态扩展[^1]。在某些 JVM 实现中,本地方法和虚拟机可能合并为一个。 当 Java 程序调用本地方法时,JVM 会通过执行引擎(Execution Engine)加载本地方法库,并在本地方法中执行相关操作[^1]。 #### 操作数 操作数是虚拟机帧的一部分,用于在方法执行过程中进行计算和数据传递。它是基于的指令集架构的核心部分,所有的计算操作都需要通过入和出完成。例如,在执行 `i++` 和 `++i` 时,操作数会临时存储操作数和中间结果。 操作数的大小在编译期确定,并在运行时固定。由于频繁的入和出操作,基于的架构虽然指令紧凑,但需要更多的指令分派和内存读写操作,这会影响执行效率[^4]。 #### 区别与作用总结 | 类型 | 作用 | 特点 | 是否存在垃圾回收 | |--------------|----------------------------------|--------------------------------------------------------------|------------------| | 虚拟机 | 管理 Java 方法调用 | 线程私有,生命周期与线程一致,存储局部变量、帧等信息 | 否 | | 本地方法 | 管理本地方法调用 | 线程私有,可动态扩展,通常与虚拟机分开 | 否 | | 操作数 | 方法执行过程中的数据计算与传递 | 帧的一部分,用于临时存储操作数和中间结果 | 否 | ```java // 示例:简单方法调用时帧的变化 public class StackExample { public static void main(String[] args) { int result = add(2, 3); System.out.println(result); } public static int add(int a, int b) { return a + b; } } ``` 在上述代码中,`main` 方法调用 `add` 方法时,会在虚拟机中创建一个新的帧,用于存储 `a` 和 `b` 的值,并在方法返回后释放该帧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值