栈内存是直接从你的物理内存上被系统划分出来的一块特定区域。栈空间可以看做是系统的一个缓存内存空间,空间很小。在windows操作系统下大小是2M。因为栈的空间是连续的,程序寻址很快,所以栈里的内存读写效率是比堆要高的。栈内存由系统内核自动管理,创建时可直接由程序员申请,超出作用域后该块内存自动被标为可用内存,以便接下来新的数据再次使用。在java中所有的引用变量和基本数据类型都在栈中,因为这些类型数据量比较小,读写很频繁,所以放在是比较小的栈中不会太拥挤,同时可以提高效率。
堆内存是你电脑所有可利用内存的整合,其中包括物理内存,虚拟内存。因此堆内存是不连续的,当须要使用堆内存时系统会查找所有堆空间中一块大小够放你申请数据的地方然后拿出来用。所以堆内数据在读写的时候,都须要系统寻址比较长的时间来查找相应的位置,所以速度比栈要慢一些。但是堆的好处是很大。你所有的电脑可用内存都在堆内存的范围内。所有用new关键词建立出来的东西都是在堆中的,java中有堆内存回收机制,所以回收也是自动的,不用程序员管理。Integer num = new Integer(888);其中num是一个引用,所以他在栈空间中,而888这个数是new出来的。所以在堆中开了一块大小为4*8 =32bit的地方用来放888这个数 int num = 5;因为没使用new所以仅仅只是在栈中开了一块大小为32bit的地方放这个5,然后把这个地方的地址给了num保存。 |