我是靠谱客的博主 深情飞机,最近开发中收集的这篇文章主要介绍JAVA中堆(heap)和栈(stack)的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在学习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)的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部