黑马程序员技术交流社区

标题: 堆和栈 [打印本页]

作者: wpj    时间: 2014-5-23 17:55
标题: 堆和栈
java中的堆和栈,一直很模糊,各位有什么理解,畅所欲言;
作者: 我是main    时间: 2014-5-23 18:30
这是在刷技术分么? 我只能把我看过的给你说一下 希望对你有帮助。java的堆是一个运行时数据区类的对象从中分配空间,这些对象通过new等指令简历,他们不需要程序代码来显示的释放。堆是由垃圾回收机制来负责的,堆的优势是可以动态的分配内存大小,生存期也不必事先告诉编译器                                                                                                                                                                                                                                                                                          
作者: 我是main    时间: 2014-5-23 18:36
接着上面   ,因为它是在运行时动态分配内存的,java的垃圾收集器会自动收走这些不再使用的数据。但也有缺点,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int,short,long,byte,float,double,boolean,char)和对象句柄。
作者: 我是main    时间: 2014-5-23 18:37
版主给分吧 纯手打 真不容易!
作者: liang090214    时间: 2014-5-23 19:58
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

一 堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)。
2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身。
二 栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中。
2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
三 方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
在Java语言里堆(heap)和栈(stack)里的区别:
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2. 栈中存放局部变量(基本类型的变量)和对象的reference。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈是跟随线程的,有线程就有栈。
3. 堆中存放对象,包括对象变量以及对象方法。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。堆是跟随JVM的,有JVM就有堆内存。
作者: 周大侠    时间: 2014-5-23 20:42
二楼的我是main、的,讲课好专业,抽象的,能否举举例子,实例化一下,大家都能看得懂
作者: 不羁的风1230    时间: 2014-5-23 21:40
刚学   不是特别懂     new出来的东西和变量放在堆内,main和局部的东西放在栈内
作者: 凌羽猎风    时间: 2014-5-23 22:18
都是内存中的区域  但是优先级以及存放的东西是不一样的   暂时对栈内存和堆内存,还有方法区  理解的都不多   以后慢慢来吧  我觉得这些应该不是刚开始着急的东西  我才刚开始学……
作者: wpj    时间: 2014-5-23 22:24
我是main 发表于 2014-5-23 18:30
这是在刷技术分么? 我只能把我看过的给你说一下 希望对你有帮助。java的堆是一个运行时数据区类的对象从中 ...

感谢您的回答,但我想您是误解我的初衷了。提问问题,固然可以赚到技术分,但主要目的还是在交流中寻求答案,提升自己,您如果看过我提的其他问题,就可以知道,我所言非虚。
作者: wpj    时间: 2014-5-23 22:25
liang090214 发表于 2014-5-23 19:58
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

一 堆区:

感谢回答!
作者: lvc    时间: 2014-5-24 01:50
又学到些东西了
作者: 小熊星座    时间: 2014-5-24 16:01
java吧内存分为栈内存和堆内存。在函数中定义的基本数据类型和对象的引用变量都在分配在栈内存中,而new创建的对象和数组存放在堆内存中。   栈(stack)的优点:存取速度比堆要快。缺点:存在栈中里面的数据大小和生存期必须是固定的,缺乏灵活性。     堆(heap)的优点:可以动态分配内存大小,java的垃圾收集器会自动清理不再使用的数据。缺点是存取的速度较慢,因为他要在运行时动态分配内存。
作者: 飘渺≮★耘    时间: 2014-5-24 21:05
堆和栈的功能可以用一句话来概括:堆主要用来存放对象的,栈主要是用来执行程序的,存在于栈内存中的数据会被自动回收,而存在于堆内存中的数据要通过java的垃圾回收器回收。      堆内存用来存放由 new 创建的对象和数组,而栈则用来存放局部变量。
作者: Fisherman    时间: 2014-5-24 23:25
给你顶一下 坐等大神
作者: 贾俊锋    时间: 2014-5-25 00:14
liang090214 发表于 2014-5-23 19:58
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

一 堆区:

正在学习,比较不是很懂,解释的很详细,学习了,
作者: Dark_Horse    时间: 2014-5-25 09:25
个人理解堆区就是存放new出来的对象,此对象有垃圾收集器收集,垃圾收集器就是针对的堆区,
栈是每调用一个方法就会创建一个栈针,存放局部变量
这个问题在java的内存结构划分中有所讲解......
作者: wuhyoung    时间: 2014-5-25 10:28
liang090214 发表于 2014-5-23 19:58
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

一 堆区:

分析的很好,多谢分享,学习了
作者: 何堂红    时间: 2014-5-25 11:30
liang090214 发表于 2014-5-23 19:58
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

一 堆区:

很清楚,比我们老师说的还明白




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2