概述
在学习JVM的内存模型的时候,堆(heap)和栈(stack)是JVM的内存区域中的重要组成部分
堆(Heap)
所有的应用可以从一个系统共有的空间中申请供自己使用的内存,这个共用的空间就叫做Heap;建立对象时,在Heap中的内存实际建立这个对象,而对象实例在Heap中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,用来定位该对象实例在Heap中的位置,便于找到该对象实例
栈(Stack)
每个应用程序用于存放临时变量、参数传递、函数调用时的值的保存的内存空间,就叫Stack;在建立对象时,Stack中分配的内存只是指向这个对象的指针(引用)而已
eg:String str1 = new String("abc"); (1)
String str2 = "abc"; (2)
System.out.println(str1 == str2); \false (3)
str1是在Heap中创建对象,Stack中存的是str1在heap中的内存地址;
str2是指向Stack里面值为“abc”的引用变量,语句(2)的执行,首先会创建引用变量str2,再查找Stack中有没有“abc”,有则将str2指向“abc”,没有则在Stack中创建一个“abc”,再将str2指向“abc”
(3)中创建了两个引用,创建了两个对象,两个引用指向不同的对象,所以结果为false
堆(Heap)和栈(Stack)的区别
1.系统区别
Stack的空间很小,存取速度仅次于寄存器,存储效率比Heap高,空间有限,Stack中的数据可以共享,但是存储在Stack中的数据大小和生存期必须是确定的,缺乏灵活性
Heap的空间是很大的自由区,存取速度较慢,可以动态的分配内存大小
2.存储时间
Stack的空间是由操作系统自动分配和释放,不存在内存回收问题
Heap是随机分配内存,不定长度,存在内存分配和回收问题;因为JVM的GC进程会定期扫描Heap,它根据Stack中保存的4字节对象地址扫描Heap,定位Heap中的这些对象,进行一些优化(例如合并空闲内存块),并且假设Heap中没有扫描到的区域都是空闲的,统统refresh(实际上操作是把Heap中丢失了对象地址的无用对象清除了),这就是垃圾清理的过程
最后
以上就是深情飞机为你收集整理的JAVA中堆(heap)和栈(stack)的区别的全部内容,希望文章能够帮你解决JAVA中堆(heap)和栈(stack)的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复