Java 系统方面的堆和栈

系统方面的堆和栈
一、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操做方式相似于数据结构中的栈。
二、堆区(heap)— 是一个可动态申请的内存空间(其记录空闲内存空间的链表由操做系统维护),在java中,全部使用new xxx()构造出来的对象都在堆中存储通常由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式却是相似于链表。
堆是全局的,堆栈是每一个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new获得的变量,都放在堆中,局部变量放在栈中,因此函数返回,局部变量就全没了java

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

  1. 栈的优点是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是肯定的,缺少灵活性。另外,栈数据能够共享,详见第3点。
    堆(能够共享)的优点是能够动态地分配内存大小,全部使用new xxx()构造出来的对象都在堆中存储,生存期也没必要事先告诉编译器,Java的垃圾收集器会自动收走这些再也不使用的数据。但缺点是,因为要在运行时动态分配内存,存取速度较慢。数据结构

  2. 常量池:存放字符串常量和基本类型常量(public static final)。
    常量池的好处是为了不频繁的建立和销毁对象而影响系统性能,其实现了对象的共享。
    例如字符串常量池,在编译阶段就把全部的字符串文字放到一个常量池中。(1)节省内存空间:常量池中全部相同的字符串常量被合并,只占用一个空间。(2)节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就能够判断实际值是否相等。

如Integer, String, Double等将相应的基本数据类型包装起来的类。这些类数据所有存在于堆中,Java用new()语句来显示地告诉编译器,在运行时才根据须要动态建立,所以比较灵活,但缺点是要占用更多的时间。ide

相关文章
相关标签/搜索