首页 > 编程知识 正文

java中的堆内存和栈内存,js栈和堆的区别

时间:2023-05-04 04:20:03 阅读:25399 作者:93

转载:

一. java堆栈

Java堆栈始终与线程相关联,每次创建线程时,JVM都会创建与该线程对应的Java堆栈。 Java堆栈包括与每个方法关联的多个堆栈,以及每次执行方法时创建的堆栈框架包括“内部变量”、“操作堆栈”和几个“在方法中定义的变量”

二.山

堆是存储Java对象的位置,也是JVM管理Java对象的中心存储空间。 堆是Java程序员最感兴趣的存储区域,因为它是与内存关系最密切的APP应用程序。

存储在堆中的每个Java对象都是该对象的类的副本,并复制从其父类继承的所有非静态属性。

由于堆由所有Java线程共享,因此访问时必须注意同步问题,并确保方法和相应属性的完整性。

存储器可以分为三个区域:方法区域、静态区域method、堆栈和堆

1 .方法区

类中的函数也存储此区域中存储的所有类和静态变量。 方法区域包含整个程序中唯一的元素,如类和静态变量。

所有线程可以共享就像积累heap一样。

2 .堆栈内存:

的都是局部变量。

然后,当变量所属的范围结束时,该变量将自动释放。

3 .积累内存

的是实体、数组和对象。 数组是对象。 每个实体都有一个起始地址值。

new出来的东西都有内存,进行默认初始化。

手动释放,不需要自动回收垃圾。

堆内存中的物理数据地址存储在堆栈变量(即引用)中,以便快速访问。 如果引用丢失,它将被垃圾收集器(GC )列入可回收的“列表”。 也就是说,它变成垃圾,等待自动回收(与c不同,c中出现new的数组需要Delete,对于类,析构函数必须析构以释放内存)。

关于存储器地址:

请只关注最左边的两个字:

“[”表示此实体为数组实体

I表示int F表示浮动

在java中将变量分配给内存

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

2、实例变量:闪闪发光的夕阳下使用java关键字new时,系统向堆开拓的不一定是连续的空间,而是分配给变量(如类实例),然后根据零散的堆内存地址实例变量的生命周期--如果对实例变量的引用丢失,它将被垃圾收集器(GC )列入可回收的“列表”中,但并不立即释放堆中的内存

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

Java将内存分为堆栈内存和堆内存两种。 函数中定义的几个基本类型的变量和对象的引用变量被分配给函数的堆栈内存,当在代码块中定义变量时,Java在堆栈中为该变量分配内存空间,当超出变量的范围时,Java自动将该变量分配给该变量

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

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

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