堆的内存和栈的内存游什么不同??? 堆的内存和栈的内存游什么不同??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 都是存储空间,JVM做了区分而已。每个JVM有1个堆,多个线程共享:存放类实例、数组。每个线程启动时JVM会分配1个栈给它:存放线程状态 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间,它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆,就是那些由new分配的内存块,他们的释放在c++和c中是程序员的职责,如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。在java中是JVM的职责,由垃圾收集机制负责回收。 据个例子:void f() { int* p=new int[5]; } 一句话就包含了堆与栈:汇编代码可以看到他们的不同: 00401028 push 14h 0040102A call operator new (00401060) 0040102F add esp,4 00401032 mov dword ptr [ebp-8],eax 00401035 mov eax,dword ptr [ebp-8] 00401038 mov dword ptr [ebp-4],eax 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 想起一句话:方法入stack 对象动态在heap 正则表达式 多线程可控么? 出现未签名错误 怎么解决 关于tomcat5.5.17的虚拟路径和servlet的问题,急,在线等待 向APPLET传参数的问题 在jbuild中如何使用自己的jar文件 哪为大哥帮我XML文件显示到一个是树上 菜鸟要拜师学艺啊! 请各位帮我看看是什么错 我开发的applet为何在ie5中不能运行? 如何做一个主窗体和子窗体? 帮看看代码,怎么运行有误,谢谢
每个线程启动时JVM会分配1个栈给它:存放线程状态
堆,就是那些由new分配的内存块,他们的释放在c++和c中是程序员的职责,如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。在java中是JVM的职责,由垃圾收集机制负责回收。
据个例子:void f() { int* p=new int[5]; } 一句话就包含了堆与栈:汇编代码可以看到他们的不同:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax