1.栈的自动内存管理机制
栈是一种先进后出的一种线性结构,类似于“叠盘子”。第一个进栈的元素最后出栈,最后一个进栈的元素最先出栈。
栈空间中的数据被系统自动管理,在函数调用的时候自动创建所需的数据空间,在函数运行结束后自动释放数据空间。在函数中的所有变量(基本类型和引用类型)都存储于栈空间。栈会在(java)程序的编译阶段被调用。例如:int y;y作为变量就存放在栈空间里。
2.基于堆的手动内存管理机制
虽然基于栈的内存管理模式简单,而且因为他的有序排列,使得栈元素的读取都比堆的读取速度快,但是在程序运行完之后,栈空间就会被自动释放,所以创建的栈空间的大小和生存周期就必须是确定的。这就导致了栈空间利用的低效。所以出现了堆这一手动内存管理机制。
基于堆的内存管理机制是一钟手动管理内存的机制,堆是一块无序的内存,系统可以通过动态内存分配指令灵活的运用堆中的空间。在程序中给出申请和释放内存的指令,就可以实现堆中空间的申请和释放。在java中,所有的对象都存储于对空间内。例如int []b={1,2,3,4,5}; 在这个语句中,b作为变量存储于栈空间内,b引用的数组对象存放在堆空间中。
堆空间的释放需要手动进行,这就会造成堆内存管理最容易发生的问题——“内存泄漏”。当某个对象没有被任何引用名直接或间接地调用的时候,这个被分配出去的内存就将无法被手动回收(因为写不出指向该内存的指令)。这就形成了所谓的“内存垃圾”。内存泄漏不会因为错误而终止,它只会默默地占用内存,造成设备性能的下降。在Java中有自带的垃圾回收机制,至今已有很多垃圾回收的算法(如:引用计数,标记-清扫,分代式收集等)。所以我们在写java程序的时候并不需要自己手动去释放内存(但在c语言中就需要手动释放内存)。
(已有研究表明,java的回收机制依旧存在弊端,仍有可能发生内存泄漏。)
此篇为大家带来了一些关于栈和堆内存管理的知识。因本人知识有限,内容和见解相对片面,恳请大家指正。希望大家喜欢。