由于自己一直会忘记栈内存和堆内存,所以百度了一些材料,总结了下。单纯的自己看看。
Java把内存划分成两种:一种是栈内存,一种是堆内存。
栈内存:栈区( stack )由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。具体来说其实就是:
凡是局部变量都在栈内存中 局部变量会在栈内存中开辟空间
局部变量 1.定义在方法中的变量 2.定义在方法名参数上的变量 3.定义在for循环中的变量 4.创建对象的引用 5.主函数main
堆内存:堆区( heap )— 亦称动态内存分配.程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存.但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。具体来说就是:
凡是new出来的都在堆内存中,new出来的叫实体。
实体包括数组和对象。
堆内存的特点:堆内存的,每一个实体都有一个存放位置,用地址值来标识在内存中存放的位置。用16进制表示。
局部变量在栈内存中,作用于函数或语句。
成员变量在堆内存中,因为对象的存在,才在内存中存在,作用于整个类中。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
先这样以后还会有所补充。