1 内存分配策略
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.
2 Java 中的堆和栈
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址(数组的下标),栈中的这个变量就成了数组或对象的引用变量。
引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
具体的说:
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量
相关推荐
计算机堆栈理解 计算机堆栈是计算机原理中非常重要的一部分,对于程序员来说非常重要。堆栈是用来存储临时变量,函数传递的中间结果,是操作系统维护的,对于程序员是透明的。下面我们将通过一个小例子来详细解释栈...
"单片机地址空间与堆栈理解" 单片机地址空间是指单片机中存储器的组织方式,包括程序存储器、内部数据存储器、SFR、位地址空间和外部数据存储器。其中,程序存储器用于存储单片机的程序代码,内部数据存储器用于...
### 堆栈初级理解应用 #### 最简单堆栈简单介绍与初级理解和应用 本文将对堆栈(Stack)的基本概念、工作原理及其简单的Java实现进行详细的解释,并通过一个具体的编程示例来帮助读者更好地理解堆栈的工作机制。 ...
### 关于单片机堆栈指针的理解 #### 一、单片机堆栈指针的概念与作用 在单片机编程中,堆栈指针(Stack Pointer, SP)是一个非常重要的寄存器,用于指示堆栈(Stack)的顶部位置。堆栈是一种特殊的线性数据结构,...
LabVIEW是一种图形化编程语言,由美国国家仪器公司(NI)开发,广泛应用于测试测量、自动化和控制系统领域。在LabVIEW编程中,堆栈是一种重要的...理解并熟练掌握堆栈和状态机的概念对于提升LabVIEW编程技能至关重要。
data –可寻址片内ram 0x00-0x7f bdata—可位寻址片内ram idata—可寻址片内ram,允许访问全部内部ram 0x00-0xff padata—分页寻址访问片外ram xdata—可寻址片外ram 0x0000- 0xffff ...
通过深入研究和实践这个“堆栈动作机”,你不仅可以掌握LabVIEW中的堆栈实现,还能提升在LabVIEW中的编程技巧和对数据结构的理解。这对你在进行复杂系统开发,尤其是在需要高效数据管理和控制逻辑的场合,都将...
1. **堆栈布局**:理解堆栈的生长方向,通常是向下生长,以及如何通过ESP(栈指针)寄存器跟踪堆栈顶部。 2. **函数调用约定**:了解不同的函数调用约定,比如stdcall、cdecl等,它们决定了参数如何压入堆栈,以及...
本文将详细解析标题为“堆栈源代码实现”的资源,旨在帮助你理解和实现自己的堆栈功能。堆栈在计算机科学中扮演着多种角色,包括函数调用、表达式求值、内存管理等。 堆栈的基本操作通常包括: 1. **压入(Push)*...
STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计。堆栈检测在STM32开发中是一项重要的任务,它能够...同时,理解并运用这些检测方法,能帮助开发者更好地管理和优化资源,提升整体的项目性能。
总的来说,践踏堆栈攻击是信息安全领域的一个重要话题,理解和防范此类攻击对于保护系统免受恶意攻击至关重要。开发者应遵循安全编码规范,使用安全的编程语言,并结合各种防御技术,以减少栈溢出漏洞的出现。同时,...
本文将深入探讨如何理解和利用高性能的堆栈跟踪,以提高错误日志的效率,以及在代码分析和度量中的应用。 堆栈跟踪是当程序抛出异常或通过其他方式触发时,系统记录的一系列方法调用的回溯。它显示了执行流程从发生...
在计算机科学中,堆栈(Stack)...无论你是初学者还是经验丰富的开发者,理解堆栈操作及其应用场景都将极大地提升你的编程能力。通过StackSamplt,你可以亲自动手,加深对堆栈操作的理解,从而更好地应用到实际项目中。
在计算机科学中,堆栈是一种非常基础且重要的数据结构,它遵循“后进先出”(LIFO)的原则。本课程设计的目标是通过编程模拟堆栈的实现...理解和掌握堆栈的工作原理及其在程序设计中的应用,对于提升编程能力尤其重要。
进程的堆栈内存管理是程序员必须理解和掌握的关键技能,特别是在低级编程或者系统级编程中。易语言,一种面向对象、简单易学的中文编程语言,也提供了对进程堆栈内存的操作支持。本文将详细解析"易语言申请进程堆栈...
通过阅读和理解源码,你可以深入学习到C语言中的指针操作、动态内存管理和数据结构实现技巧。 总结来说,这个“数据结构-顺序堆栈”项目旨在通过C语言实现一个灵活、高效且可扩展的堆栈数据结构。通过泛型编程,...
在这个"java 堆栈的演示程序"中,我们可能会深入理解堆栈的工作原理以及它在运行jsp程序时的角色。源代码设计将帮助我们直观地看到如何在实际编程中使用堆栈。 首先,我们要明白堆栈是Java中用于存储局部变量、方法...
对于不会用堆栈和对堆栈理解不是很深入深入的初学者来说是一个不容错过的资料。拿来和大家共享一下!
在编程领域,异常处理是确保程序健壮性的重要机制,特别是在使用C++这种语言时,理解和掌握堆栈和异常处理的原理至关重要。vC(可能是VC++,即Visual C++的简称)是Microsoft开发的一个集成开发环境,它包含了对C++...