C、JAVA存储管理不同点
凡是要执行的程序代码,要处理的数据都必须放置在内存中。一般OS将占用内存的高地址部分,而其他剩余的内存供程序和数据使用,一般情况下,程序不能对操作系统占有的内存进行操作。
在程序的执行过程中,程序中的数据的存取是通过对应地存储单元进行的。在早期的计算机中,这个存储工作由程序员自行完成;在有了高级语言之后,程序中使用的存储单元都是由变量(标识符)来表示,它们都对应的内存地址由编译程序在编译时或由其生成的目标程序运行时进行分配。这两种不同的处理方式实际上代表了不同的存储管理方式:静态存储分配和动态存储分配。
C的存储管理
一个由C编译的程序占用的内存分为一下几个部分:
- 栈区:由编译器自动分配释放,存放函数参数、局部变量等
- 堆区:一般由程序员分配(malloc)释放(free),若程序员未释放,则在程序结束时可能由OS回收
- 全局区:也称为静态区,全局变量和静态变量是存放在一起的,初始化过的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由OS释放
- 文字常量区:存放常量字符串,程序结束后由OS释放
- 程序代码区:存放函数体的二进制码
在C程序中,堆是大家共有的空间,堆在操作系统对进程初始化的时候分配,运行过程中也可以像系统申请额外的堆,但是用完一定释放,不然会造成内存泄漏。
而栈是每个线程独有的,保存其运行状态和局部变量。栈在线程开始的时候初始化,每个线程的栈相互独立,因此,栈是线程安全的。
JAVA的存储管理
JAVA把内存空间划分为4个部分:
- 栈区:由编译器自动分配释放,存放函数的参数值、局部变量值等具体方法执行结束之后,系统自动释放JVM内存资源
- 堆区:一般由程序员分配释放,存放new出来的对象和数组,JVM会补丁时查看这个对象,若没有引用指向这个对象就将其回收()
- 静态区:存放全局变量,静态变量和字符串常量,不释放
- 代码区:存放程序中方法的二进制码,而且是多个对象共享一个代码空间区域
对于堆和栈,JAVA不允许程序员直接设置,而是由JVM自动管理。
例如, 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用;在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接(http://www.cnblogs.com/Echo-41/p/7683894.html)。