黑马程序员技术交流社区

标题: 内存方面不太明白几个问题,建议内存分配的人也都来看看 [打印本页]

作者: 瞿乐    时间: 2012-8-6 01:47
标题: 内存方面不太明白几个问题,建议内存分配的人也都来看看
我们常用的,我知道是 堆内存,栈内存,方法区。我听说在JAVA中还有其它什么内存。
谁能说说,还有什么吗?可以用简洁的语言说说它们之间的最大区别吗,我已经知道了:
1:变量都是在栈中,栈内存中存取速度快些
2:实例对象在堆内存开辟,,堆相对较慢些。(仅此而已吗?)
3:方法区,放一些 方法和一些静态什么的(像静态变量,静态代码块,静态函数),

顺便问个小问题,我记得short有缓存区,这个缓存区在哪里?平时没有在哪里看过。 是只有short这种数据类型才有缓存区吗?
这些个问题最近都在我心头纠结啊~  
作者: 余明辉    时间: 2012-8-6 02:04
java内存的几种存储区域
寄存器:在CPU内部,由虚拟机管理,我们无法触碰到
栈:由系统自动分配,速度较快,我们无法控制的
堆:堆的好处是有很大的灵活性,如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。
静态存储区域与常量存储区域:静态存储区用来存放static类型的变量。常量存储区用来存放常量类型(final)类型的值
非RAM存储:硬盘等永久存储空间

希望可以帮到你
作者: 樊占江    时间: 2012-8-6 02:09
你这个问题我好像以前帮别人回答过,
栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容堆中存放使用new关键字创建的对象.字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中
作者: 瞿乐    时间: 2012-8-6 02:14
好像没有说到重点哦,感觉沙发说的方法区不太理解,我看毕老师的每次都是方法区,静态存储区域与常量存储区域是两块不同的区域还是都是方法区,那个 缓存在哪里呢?
作者: 尤洋    时间: 2012-8-6 07:47
Java里short间的计算的结果会被转换为Integer,而Integer对应的是对象,
在-128~127之间Integer自动封装的对象都在常量池里,并且不同的变量对应相同的数字的话 都会指向同一个对象
比如说Integer a=50;Integer b=50;  则 a==b。
我个人理解short的 缓存就是指的这个。

作者: 尤洋    时间: 2012-8-6 08:20
楼主不用把内存想的太复杂,按我自己的理解:
    栈内存是用来 操作数据,----》为什么用来操作数据?因为他运行速度快,数据用完就释放-------》为什么不用他来存储数据?因为他需要事先了解数据的大小及生命周期了才会进行存储,用起来不方便;----》他怎么操作数据?利用变量对应的地址去操控堆中的实体对象。
    堆内存用来存储数据;---------》为什么不用他来操作数据?因为他用完的数据要等 垃圾回收机制去清除,速度较慢。------------》为什么用他来存储数据?—————》因为Java编译器不需要知道从堆里需要分配多少存储区域,就可以直接去存储,存着方便。
    方法区则名副其实 就是放着方法的实体,其中有静态区和非静态区,静态区存着静态方法和静态变量,非静态区存着一般方法,
当要使用方法时,该函数进栈,用完跳栈。
   还有一些细节东西太琐碎了,我打字慢就不写了。
   
作者: 瞿乐    时间: 2012-8-6 19:31
尤洋 说的好啊
我想我大概明白了
作者: 张振纲    时间: 2012-8-6 20:38
首先,栈内存的所有数据用完空间就会释放,
       而堆内存中使用的是垃圾回收机制,不会立即释放

栈内存里存放的多是引用数据 即堆内存中的地址值





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