黑马程序员技术交流社区

标题: 关于内存使用问题 [打印本页]

作者: 尹旗龙    时间: 2012-2-2 17:32
标题: 关于内存使用问题
本帖最后由 尹旗龙 于 2012-2-3 08:32 编辑

看视频的时候 老师对堆 栈 缓冲区的使用并没有系统的讲 现在对他们的使用原理也很不清楚 谁能总结下他们经常在的在什么时候用 有什么区别 不需要讲他们的结构特点
作者: 张伟~    时间: 2012-2-2 18:02
本帖最后由 张伟~ 于 2012-2-2 18:03 编辑

简单点说当我们创建一个方法时,栈就是用来存放这个方法里定义的变量,这个栈内存随着方法的执行结束而销毁。
而你所创建的对象则是放在堆内存里,而且堆内存中得对象随着方法的执行结束不会被销毁,只有当没有任何引用变量引用它时才会在合适的时候被垃圾回收器回收。

至于缓冲区其实就是一个暂时容器,用它可以提高效率,比如我们把要读取的数据,先存放在缓冲去区里,任何再一次性的读取过来,道理就像我们挑水时,是我们先把水放到桶子里,然后再一次挑回来,还是每一次拿个瓢一瓢一瓢的送水快呢,显然前者有效率的多。 缓冲区的事毕老师在讲IO的视频里还是讲的很清楚的了,你自己去看看吧

作者: 任增涛    时间: 2012-2-2 18:52
老师讲清楚了呀。
主要区分栈和堆,缓冲区可以单拿出来说。
缓冲区可以当做衡量计算机处理速度,硬盘质量的一个指标,当处理数据的时候,缓冲区起到一个暂时存储的作用,这样就可以把数据尽量少的倒入内存,避免数据占据大量的存储空间!提高运行速度。   
栈:存储在栈里的方法中的变量,是随着栈的消失而丢失的,特点:数据使用完毕,自动销毁。
堆:
堆:堆中
作者: 任增涛    时间: 2012-2-2 19:00
不好意思,按错了,鼠标有毛病。
堆:堆中的数据在使用完毕后,没有变量引用它,会被废弃,但是不会当时销毁,会在过一段时间后销毁。
我觉得他们的区别主要是:一个自动立即销毁,一个保证无引用后,过一段时间后销毁。
作者: 尹旗龙    时间: 2012-2-2 19:01
也就是在编译时虚拟机自动存储的对吧,不会出现对象引用存放到栈里之类的现象吧
作者: 陈丹阳    时间: 2012-2-2 23:23
Java的内存分配有三种,
1、静态存储区:内存在程序编译时就分配好了,比如静态变量;
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存,而在栈区存放该对象的引用。

Java程序的多个部分(方法,变量,对象)驻留在内存中以下两个位置:即堆和栈,现在我们只关心3类事物:实例变量,局部变量和对象: 实例变量和对象驻留在堆上 局部变量驻留在栈上 让我们查看一个java程序,看看他的各部分如何创建并且映射到栈和堆中: java内存管理总结.pdf (151.81 KB, 下载次数: 228)
  1. public class Dog
  2. {
  3.         Collar c; String name;
  4.         //1. main()方法位于栈上
  5.         public static void main(String[] args)
  6.         {
  7.                 //2. 在栈上创建引用变量d,但Dog对象尚未存在
  8.                 Dog d;
  9.                 //3. 创建新的Dog对象,并将其赋予d引用变量
  10.                 d = new Dog();
  11.                 //4. 将引用变量的一个副本传递给go()方法
  12.                 d.go(d);
  13.         }
  14.         //5. 将go()方法置于栈上,并将dog参数作为局部变量
  15.         void go(Dog dog){
  16.         //6. 在堆上创建新的Collar对象,并将其赋予Dog的实例变量
  17.         c =new Collar(); }
  18.         //7.将setName()添加到栈上,并将dogName参数作为其局部变量
  19.         void setName(String dogName)
  20.         {
  21.                 //8. name的实例对象也引用String对象
  22.                 name=dogName;
  23.         }
  24.         //9. 程序执行完成后,setName()将会完成并从栈中清除,此时,局部变量dogName也会消失,尽管它所引用的String仍在堆上
  25. }
复制代码

作者: 尹旗龙    时间: 2012-2-3 08:28
楼上讲的正是我想要的,非常感谢




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