首页 技术 正文
技术 2022年11月15日
0 收藏 746 点赞 3,216 浏览 793 个字

一、堆内存和栈内存

程序运行时内存分配有三种:静态存储分配,栈式存储分配,堆式存储分配

1.静态存储分配:

在程序编译时就可以确定数据目标在运行时所需要的内存,因此在编译时就为其分配固定大小的内存。

这种分配策略不允许代码中有可变数据结构,比如可变数组,嵌套循环结构或者递归,否则无法计算所需要的内存空间。

2.栈式存储分配:

在程序编译时无法计算所需要内存,只有在程序运行时才可以确定数据目标所需要的内存。

要求程序运行到一个模块的入口处,就可以计算该模块数据区所需要的内存空间。

栈内存是由编译器分配和释放的。

3.堆式存储分配:

在程序编译时和运行到模块入口处都无法计算分配内存的大小的情况,就需要进行堆式存储分配。

比如可变字符串和对象实例。

堆内存是由程序员向操作系统发出请求进行分配和释放的,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间。因此用堆的效率非常低.

但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。

事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.

二、Java中堆内存和栈内存

1.Java中的栈内存:在函数中定义的一些基本数据类型的变量(比如int, short, long, byte, float, double, boolean, char)和对象的引用变量都是在栈内存中分配的。

释放:当超过变量的作用域之后,Java就会自动释放掉栈内存,然后另作他用。

2.Java中的堆内存:由new创建的对象和数组都是在堆内存中分配的。

释放:由Java虚拟机垃圾回收机制进行回收。

在堆中产生一个数组或者对象之后,还可以在栈中定义一个特殊变量,这个变量的取值等于堆内存中的数组或者对象的首地址。栈中的这个变量就成了数组或者对象的引用变量。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,497
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,910
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,744
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,498
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,135
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,300