浅谈Java 中的堆和栈

来源:互联网 发布:java中的集合框架 编辑:程序博客网 时间:2024/05/20 11:52

Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存。

栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方,,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

栈(stack)是操作系统在建立某个进程或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

特点:存取速度比堆要快,仅次于直接位于CPU中的寄存器。

栈内存的一个特点是数据共享,这样设计是为了减小内存消耗,如果常量在栈内存中,就将变量指向该常量,如果没有就在该栈内存增加一个该常量,并将变量指向该

缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

存放对象:①一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象地址

②方法的形参 直接在栈空间分配,当方法调用完成后从栈空间回收。

①方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。

②局部变量声明出来之后,在栈控件和堆空间中分配空间,当局部变量生命周期结束后,它的栈空间立刻被回收,它的堆空间等待GC回收。
堆:

Java应用都唯一对应一个JVM实例,每一个JVM实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或者数组都放在这个堆中,并由应用所有的线程共享。Java中分配堆内存是自动初始化的,Java中所有对象的存储空间都是在堆中分配的,但这些对象的引用则是在栈中分配,也就是一般在建立一个对象时,堆和栈都会分配内存。

特点:可以动态地分配内存大小、比较灵活,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

缺点:由于要在运行时动态分配内存,存取速度较慢。

主要存放:①由new创建的对象和数组 ;②this

特殊:引用数据类型(需要用new来创建),既在栈控件分配一个地址空间,又在堆空间分配对象的类变量。


RAM数据存放位置:

寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。不能操作

栈(stack):栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内 存。这是一种快速有效的分配存储方法,仅次于寄存器。不能操作

堆(heap):用于存放所有的引用空间和内容。堆不同于堆栈的好处是:编译器 不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。
静态存储(static storage):静态存储里存放程序运行时一直存在的数据。
常量存储(constant storage):常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。存放在rom

非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

注:每个线程包含自己的一个栈区,栈中只保存基本数据类型和自定义对象的引用。

每个栈中的数据(基本类型和对象引用)都是私有的,其他栈不可访问。

栈 = 基本类型变量区 +引用类型变量区 + 操作指令区(存放操作指令)



0 0