A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡刚涛 中级黑马   /  2012-8-9 11:28  /  1384 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于存储的一个问题希望高手给与指点
   在java中涉及的数据:变量,函数(方法),静态函数(方法),数组,对象,集合,代码块,静态代码块以及IO流等,它们在java内存中存储位置,以及加载的方式。
   求解!!!

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 鼓励一个!

查看全部评分

3 个回复

倒序浏览
楼主问的是一个大问题啊
关于java的内存分配机制
属于一门课程
其实我们目前没有必要研究这个
只需要知道java把内存分为堆和栈就可以了
堆中存放的是:对象和数组 凡是用new建立的 都存在于堆中
栈中存放的是:基本类型变量和对象引用变量

其他还有神马 常量池 方法区 你知道有这么个东西就行了
常量池中主要是String类型的字符串
方法区中主要存放的是方法,非静态方法

其他像类啊,集合啊,静态方法啊,静态方法属于类本身,等等这些都是对象所以都是存在于堆中

关于加载:
首先是静态的包括方法啊变量啊代码块之类的,先于类存在
其次是类本身,集合啊,非静态变量,方法啊等等你都可以理解为随着类的加载而加载
回复 使用道具 举报
给你介绍下面这存储数据的内存,你就明白额。。。。。
寄存器:
     这是速度最快的存储场所,因为寄存器位于处理器内部,这一点和其他的存储媒介都不一样。不过寄存器个数是有限的。在内存中的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。所以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。,也没办法在程序里头感觉到寄存器的任何存在迹象。
Stack(栈):
    位于一般的RAM中。处理器经由指针提供直接支持。当程序配置一块新的内存时,stack指针便往后移;释放内存时,指针则往前移。这种方式不仅很快,效率也高,速度仅次于寄存器。用于存放对象引用以及基本的数据类型对象,不能用于存储Java对象本身。
Heap(堆):
    一种通用的内存空间,用来存放Java对象。Heap不同于stack之处在于,编译器不需知道究竟得从heap中配置多少空间,也不需知道从heap上配置的空间究竟需要存在多久。因此,自heap配置存储空间可以获得高度的弹性。每当你需要产生对象,只需在程序中使用new,那么执行的时候,便会自heap配置空间。当然,你得为这样的弹性付出代价:从heap配置空间,比从stack配置,所耗费的时间多了不少。
静态存储区域与常量存储区域:
    静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量,需要明确的一点就是,Java对象是不保存在这个地方的,而只是把对象中的一些特殊元素放置这。

    在Java对象中还有一类特殊的元素,我们叫做常量。由于常量的值是稳定不变的,如圆周率。为此把他们放在代码的内部是可行的。不过有些时候,在进行一些嵌入式系统开发的时候,我们往往不这么做。而是会把常量元素跟代码分开来保存。如我们会根据情况把常量的值存放在一些只读存储器中。这主要是为了一些特殊的功能考虑的。如出于版权控制的需要。如在打印机上为了保护原装耗材的版权,往往把常量跟代码分开存放
非RAM存储:
    有时候,有些程序运行所需要的数据我们还会放置在其他地方。如在一些系统中需要用到流对象,这个对象的数据并没有保存在上面所谈到的任何一个存储区域,这个对象直接被转为为字节流,发送到其他的主机上去了。另外有一种叫做持久化的对象,其是被存储在硬盘中的
回复 使用道具 举报
问题已经解决!!!多谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马