首页 > 编程知识 正文

java中的堆内存和栈内存,java类实现堆栈先进后出

时间:2023-05-03 14:59:27 阅读:31201 作者:1607

JVM是基于堆栈的虚拟机。 JVM为每个新创建的线程分配堆栈。 也就是说,对Java程序来说,它是通过堆栈操作执行的。 堆栈以帧为单位保存线程的状态。 JVM只对堆栈进行两种操作:帧单位的堆栈操作和堆栈操作。

区别:

1 .堆内存用于存储由new创建的对象和数组。

2 .堆栈内存用于存储方法和局部变量等

3 .堆栈先进先出、后退后出

4 .堆栈后进先出,先进后出

相同:

1 .都是Java存储器的一种

2 .系统会自动回收它,但堆内存的一般开发人员会自动回收

函数中定义的一些基本类型的变量和对象的引用变量被分配给函数的堆栈内存。

在代码块中定义变量后,Java会在堆栈中为该变量分配内存空间。 当超出变量的范围时,Java会自动释放分配给该变量的内存空间,该内存空间可以立即用于其他用途。

堆内存用于存储由new创建的对象和数组。

分配给堆的内存由Java虚拟机的自动垃圾收集器管理。

在堆中生成数组或对象后,还可以为堆栈定义特殊变量,以使堆栈中此变量的值等于堆内存中数组或对象的起始地址。 堆栈中的此变量将成为数组或对象的引用变量。

引用变量与赋予数组或对象的名称相同。 稍后可以在程序中使用堆栈中的引用变量访问堆中的数组或对象。

在java中将变量分配给内存

1、类变量(静态限定变量)程序加载时系统在堆中打开内存,堆中的内存地址存放在堆栈中便于快速访问。 静态变量的生命周期--持续到“系统”关闭

2、实例变量)在爱情外套中使用java关键字new时,系统在堆中开拓不一定是在连续的空间中被分配给变量(例如类实例),其次是基于零散堆存储器的地址实例变量的生命周期--如果对实例变量的引用丢失,它将被垃圾收集器(GC )列入可回收的“列表”中,但并不立即释放堆中的内存

3、局部变量:局部变量声明在某个方法或某个代码段中,执行时在堆栈中打开内存。 局部变量脱离范围时,内存立即释放

附件: java的内存机制

Java将内存分为堆栈内存和堆内存两种。 在函数中定义的一些基本类型的变量和对象的引用变量已分配给函数的堆栈内存。 在代码块中定义变量后,Java会在堆栈中为该变量分配内存空间,如果超出变量的范围,Java会自动释放分配给该变量的内存空间,该内存空间可以立即用于其他用途。

堆内存用于存储由new创建的对象和数组,分配给堆的内存由Java虚拟机的自动垃圾收集器管理。 在堆中生成数组或对象后,还可以为堆栈定义特殊变量,以使堆栈中此变量的值等于堆内存中数组或对象的起始地址。 堆栈中的此变量将成为数组或对象的引用变量,以后可以通过编程方式使用堆栈中的引用变量访问堆中的数组或对象。 引用变量与赋予数组或对象的名称相同。 参照变量是普通变量,在定义时分配给堆栈,参照变量在程序运行到该范围外后释放。 数组和对象本身被分配给堆,即使程序运行在包含使用new生成数组或对象的语句的代码块之外,也不会释放数组和对象本身占用的内存。 当引用变量不指向它时,数组和对象会变成垃圾,不可用,但它们仍然占用内存空间,并在随后的不确定时间被垃圾收集器接受。

这也是Java占用内存的原因。 实际上,堆栈中的变量指向堆内存中的变量。 这就是Java中的指针。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。