1.关于堆(heap)和栈(stack)的区别是什么,局部变量是存放在堆里还是栈里?而全局变量又是存放在那里?
我本来的理解是,放在堆里的东西,虚拟机是自动回收的,这么说来是,局部变量是方在堆里的,而全局变量是放在栈里的,所以要手动回收(通常是让其指向为null,)不知道是不是这样?2.static修饰的变量是放在那里?堆里还是栈里?3.new出来的对象是放在那里的?请高手帮忙一下,最好能用代码说明一下,真心谢过了。
我本来的理解是,放在堆里的东西,虚拟机是自动回收的,这么说来是,局部变量是方在堆里的,而全局变量是放在栈里的,所以要手动回收(通常是让其指向为null,)不知道是不是这样?2.static修饰的变量是放在那里?堆里还是栈里?3.new出来的对象是放在那里的?请高手帮忙一下,最好能用代码说明一下,真心谢过了。
解决方案 »
- 如何在DefaultMutableTreeNode中加图标????
- 请问重载与多态是不是一个概念啦
- 用DecimalFormat类怎么让一个小数有且只保留两位小数?
- 请教一下关于位操作在JAVA里的应用,一直不太明白这个,请问在JAVA中位操作都有哪些应用呢?最好有例子,不胜感激!
- 为什么是空值呀
- 请问我怎么样才能实现每格一段时间触发一个动作?java有没有类似其他语言中的OnTimer方法?
- 如何在swing中调用ocx影像控件?
- 组件大小如何设定???
- 能不能把java程序直接编译成本地机器码执行?
- actionPerformed为什么在我点击connect按钮的时候不响应阿?大虾高手帮忙阿?
- 一个有关菜单的问题
- 请高手解决问题,我编译错误,为什么
(2)Stack(栈):位于一般的RAM(随机访问内存),速度仅次于Registers。存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中。
(3)Heap(堆):也位于RAM,存放用new产生的数据。他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,但分配空间的速度比Stack慢很多。
(4)Static storage(静态存储空间):位于RAM,存放在对象中用static定义的静态成员,它是“程序执行期间”一直存在的数据,Java对象本身是不会被分配在这里的。
(5)Constant storage(常量存储空间):存放常量。
(6)NON-RAM存储空间:硬盘等永久存储空间,实现对象的持久化存储。java编程思想里面都有的
stack是程序运行(或者叫线程更合适)的时候JVM分配给他的,里面有该程序当前的状态。呵呵。
2,static修饰的变量的特点是new一个对象的时候就分配了内存。而其他是要初始化的时候才分配。也是作为一个变量而已。
3,见1。放在堆里的。
(2)Stack(栈):位于一般的RAM(随机访问内存),速度仅次于Registers。存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中。
(3)Heap(堆):也位于RAM,存放用new产生的数据。他比stack好在编译器不需要知道实际在heap中存储数据的大小,也不知道这个空间需要分配多长时间,弹性好,但分配空间的速度比Stack慢很多。
(4)Static storage(静态存储空间):位于RAM,存放在对象中用static定义的静态成员,它是“程序执行期间”一直存在的数据,Java对象本身是不会被分配在这里的。
(5)Constant storage(常量存储空间):存放常量。
(6)NON-RAM存储空间:硬盘等永久存储空间,实现对象的持久化存储。
栈里存放的数据必须是知道它的大小和作用范围,编译器生成相应的代码以便向上和向下移动指针(创建和释放),函数的局部变量也应该存放在里,因为虚拟机会自动回收,
堆:程序运行时候动态分配的,需要程序员手动去释放它(让指向他的引用为null),速度慢,存放的大小和时间不受限制,用new生成的java对象就放在堆里。还有,栈里的数据的生存空间一般在当前的scope内有效。
关于局部变量存放在栈里,我有一处不大理解:
比如:
method(){
String str = “”;
int i = 0;
}
str是存放在堆里还是栈里?因为它不是一个基本类型,而是个对象。
按照实例应该放在堆里,岂不是和局部变量放在栈里矛盾?
直接“杀死”就是直接把一个引用赋NULL值、间接是指所有引用这个对象的对象都已不复存在、这个和GC的工作机制又有关系、GC是把堆中所有对象作为树型结构看待、GC启动后要全树搜索、找到符合上述条件的对象就将其回收、同时GC还要重新整理回收过的堆、这个和操作系统的存储管理类似。栈之所以快就是因为它是物理连续的、所有操作都是指针跳转、传统数组就是因为这一点所以是最快的、除此之外内存中还有全局区、代码区等等、而且不同语言的具体做法都是不一样的、Registers(寄存器)主要目的是为了大大提高CPU的指令搜索效率、Registers(寄存器)大则CPU的指令搜索命中率大大提高、Registers(寄存器)又分一级全速缓存、二级缓存、有些二级缓存是放在主板上的、Registers(寄存器)不应算在内存管理范畴内、.NET中的结构体就是一种存储在栈中的对象结构、而JAVA的对象数组...太多了、抛砖、希望高手赐教、
栈里存放的数据必须是知道它的大小和作用范围,编译器生成相应的代码以便向上和向下移动指针(创建和释放),函数的局部变量也应该存放在里,因为虚拟机会自动回收,
堆:程序运行时候动态分配的,需要程序员手动去释放它(让指向他的引用为null),速度慢,存放的大小和时间不受限制,用new生成的java对象就放在堆里。