对java堆、栈的理解
来源:互联网 发布:svn迁移到linux 编辑:程序博客网 时间:2024/06/08 09:09
什么叫堆?你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张。
什么叫栈?AK-47的弹匣就是一个栈,在上面的子弹没被取出之前,你无法取出下面的子弹——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子弹。
堆很灵活,但是不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的 NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。
栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。
官方的解释:
Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
通俗的理解:
1.Heap:对象实例,实际上是保存对象实例的属性值、属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中);
对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。
2.Stack:基本数据类型包括byte、int、char、long、float、double、boolean和short、对象的引用地址、函数方法(属于指令)。
总结:
垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap。
- 对java堆、栈的理解
- 自己谈谈对java堆和栈的理解
- Java中对栈和堆的理解
- 对”堆”的理解
- iOS 对堆和栈的理解
- 对静态区,栈,堆的理解
- 对堆排序的理解
- 对虚拟机中堆和栈错误理解的澄清(java/c#)
- java中堆和栈的理解
- Java栈与堆的深刻理解
- Java中堆和栈的理解
- Java 引用,栈 堆 的理解
- JAVA中堆和栈的理解
- java堆与栈的理解
- 对堆heap和栈stack的理解
- 程序员对堆和栈应该要有的理解
- 对堆、桟、堆栈的理解
- 栈、堆的理解
- crontab任务运行报错:Crontab FailureEmails - /bin/sh: 1 : ambiguous redirect
- Bridge模式
- 20160222 C基础知识点易遗漏点
- JAVA简易WEB服务器(一)
- 获取apk签名指纹的md5值 防止重新被打包
- 对java堆、栈的理解
- 项目中用到的bluetooth4.0协议的定制
- 关于内存泄露问题
- Web3D
- NSJSONSerialization-JSON数据与NSDictionary和NSArray之间的转化
- Android中的网络管理源码分析--netd
- Java-多态
- windows下php redis扩展安装
- LVS_keepalived