如何选择合肥网站建设,怀化网站建设企业,和各大网站做视频的工作总结,狗贩子怎么做网站卖狗文章目录1.概述1.1 堆1.2 栈2.堆内存2.1 什么是堆内存?2.2堆内存的特点是什么?2.3new对象在堆中如何分配?3.栈内存3.1什么是栈内存?3.2栈内存的特点3.3栈内存的内存分配机制3.4数据共享4.栈与堆的区别4.1差异4.2相同5. 面试题: java堆和栈的区别**申请方式****申请后系统的…
文章目录1.概述1.1 堆1.2 栈2.堆内存2.1 什么是堆内存?2.2堆内存的特点是什么?2.3new对象在堆中如何分配?3.栈内存3.1什么是栈内存?3.2栈内存的特点3.3栈内存的内存分配机制3.4数据共享4.栈与堆的区别4.1差异4.2相同5. 面试题: java堆和栈的区别**申请方式****申请后系统的响应****申请大小的限制****申请效率的比较****堆和栈的存储内容**1.概述
在Java中内存分为两种一种是栈内存另一种就是堆内存。
JAVA在程序运行时在内存中划分5片空间进行数据的存储。分别是
寄存器。本地方法区方法区。栈。堆。
1.1 堆
可以把堆理解为一家餐厅里面有200张桌子也就是最多能同时容纳200桌客人就餐来一批客人就为他们安排一些桌子如果某天来的客人特别多超过200桌了那就不能再接待超出的客人了。 当然进来吃饭的客人不可能是同时的有的早有的晚先吃好的客人老板会安排给他们结账走人然后空出来的桌子又能接待新的客人。 这里堆就是餐厅最大容量200桌就是堆内存的大小老板就相当于GC(垃圾回收)给客人安排桌子就相当于java创建对象的时候分配堆内存结账就相当于GC回收对象占用的空间。
1.2 栈
接着把栈比作一口废井这口井多年不用已经没水了主人现在把它作为贮存自酿酒的地方存酒的时候就用绳子勾着酒坛子慢慢放下去后面再存就一坛一坛堆着放上去取酒的时候就先取最上面的坛子。
2.堆内存
2.1 什么是堆内存?
堆内存是是Java内存中的一种它的作用是用于存储Java中的对象和数组当我们new一个对象或者创建一个数组的时候就会在堆内存中开辟一段空间给它用于存放。
2.2堆内存的特点是什么?
第一点堆其实可以类似的看做是管道或者说是平时去排队买票的的情况差不多所以堆内存的特点就是先进先出后进后出也就是你先排队好你先买票。
第二点堆可以动态地分配内存大小生存期也不必事先告诉编译器因为它是在运行时动态分配内存的但缺点是由于要在运行时动态分配内存存取速度较慢。
2.3new对象在堆中如何分配?
由Java虚拟机的自动垃圾回收器来管理
3.栈内存
3.1什么是栈内存?
栈内存是Java的另一种内存主要是用来执行程序用的比如基本类型的变量和对象的引用变量
3.2栈内存的特点
第一点栈内存就好像一个矿泉水瓶像里面放入东西那么先放入的沉入底部所以它的特点是先进后出后进先出
第二点存取速度比堆要快仅次于寄存器栈数据可以共享但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性
3.3栈内存的内存分配机制
栈内存可以称为一级缓存由垃圾回收器自动回收
3.4数据共享
例子
int a 3; int b 3; 第一步处理: 1.编译器先处理int a 3; 2.创建变量a的引用 3.在栈中查找是否有3这个值 4.没有找到将3存放a指向3 第二步处理: 1.处理b3 2.创建变量b的引用 3.找到直接赋值 第三步改变: 接下来 a 4 同上方法 a的值改变a指向4b的值是不会发生改变的 如果是两个对象的话那就不一样了对象指向的是同一个引用一个发生改变另一个也会发生改变
4.栈与堆的区别
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈, 也就是说, 对于一个Java程序来说它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作: 以帧为单位的压栈和出栈操作。
4.1差异
1.堆内存用来存放由new创建的对象和数组。 2.栈内存用来存放方法或者局部变量等 3.堆是先进先出, 后进后出 4.栈是先进后出, 后进先出
4.2相同
1.都是属于Java内存的一种 2.系统都会自动去回收它但是对于堆内存一般开发人员会自动回收它
5. 面试题: java堆和栈的区别
Java栈是与每一个线程关联的JVM在创建每一个线程的时候会分配一定的栈空间给线程主要存放线程执行过程中的局部变量方法的返回值基本类型的变量,int, short, long, byte, float, double, boolean, char以及方法调用的上下文。栈空间随着线程的终止而释放栈的优势是存取速度比堆要快栈数据可以共享。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。栈有一个很重要的特殊性就是存在栈中的数据可以共享。
Java中堆是由所有的线程共享的一块内存区域堆用来保存各种JAVA对象比如数组线程对象等,java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的堆的优势是可以动态地分配内存大小, 生存期也不必事先告诉编译器因为它是在运行时动态分配内存的Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢。
申请方式
栈由系统自动分配。例如在声明函数的一个局部变量int b系统自动在栈中为b开辟空间。堆需要程序员自己申请并指明大小在C中用malloc函数在C中用new运算符。
申请后系统的响应
栈只要栈的剩余空间大于所申请的空间系统将为程序提供内存否则将报异常提示栈溢出。堆操作系统有一个记录空间内存地址的链表当系统收到程序的申请时会遍历链表寻找第一个空间大于所申请空间的堆节点然后将节点从内存空闲节点链表中删除并将该节点的空间分配给程序。对于大多数操作系统会在这块内存空间中的首地址处记录本次分配的大小这样代码中的delete语句才能正确的释放本内存空间。另外由于找到的对节点的大小不一定正好等于申请的大小系统会自动地将多余的那部分重新放入到链表中。
申请大小的限制
栈在Windows下栈是向低地址拓展的数据结构是一块连续的内存的区域。站定地址和栈的大小是系统预先规定好的如果申请的内存空间超过栈的剩余空间将提示栈溢出。 堆堆是向高地址拓展的内存结构是不连续的内存区域。是系统用链表存储空闲内存地址的不连续。
申请效率的比较
栈由系统自动分配速度较快。但程序员无法控制。堆由new分配的内存一般速度比较慢而且容易产生内存碎片不过用起来方便。
**拓展**在Windows操作系统中最好的方式使用VirtualAlloc分配内存。不是在堆不是在栈而是在内存空间中保留一块内存虽然用起来不方便但是速度快也很灵活。
堆和栈的存储内容
栈在函数调用时第一个进栈的是主函数的中的下一条指令函数调用的下一个可执行语句的地址然后是函数的各个参数。在C编译器中参数是由右往左入栈的然后是函数的局部变量。静态变量不入栈。堆一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。
数据结构方面的堆和栈与上边叙述不同。这里的堆是指优先队列的一种数据结构第一个元素有最高的优先权栈实际就是满足先进后出的性质的数学或数据结构。
参考文章(侵删): Java 堆和栈的区别 一分钟彻底理解Java中的堆和栈