您好,登录后才能下订单哦!
本篇内容介绍了“java栈与堆是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
所有的java程序在运行时,都要在内存中开辟一个空间,并且在JVM(java虚拟机)运行的时候,会分得更加的细致,虚拟机中每一片内存的处理方式都是不一样的,所以需要进行单独的管理。
JVM的内存一共分为5种:
寄存器,本地方法区,方法区,堆内存,栈内存
今天我们主要讲堆内存与栈内存。
栈内存:
栈内存主要储存的是局部变量,也就是说,是定义在方法之内的,都叫局部变量。线程执行的时候调用方法的内存模型,当方法执行的时候,会创建一个叫“栈帧”的内存结构,栈帧会储存该方法内用到的局部变量表,操作数栈、返回地址、动态连接等信息。(这里新手主要了解局部变量表与返回地址就好了,局部变量表顾名思义是用来储存局部变量的,方法返回地址,是指方法在运行过程中,可能会正常退出,也可能会异常退出,但是不管哪种退出方式,都要让调用者知道方法退出的位置,方法返回地址就是用来确定退出位置的。)一个方法从方法被调用开始,到方法执行结束,就是一个栈帧在java栈中从入栈到出栈的全过程。
堆内存:
堆内存储存的是对象,也就是new出来的都在堆里,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。
通俗一点说堆和栈的区别:堆主要用来存放对象的,栈主要用来执行程序的。
那么栈和堆有什么不同呢,我们可以从几个方面看待他们的不同!
顺序:
栈是先进后出,堆是先进先出
缓存:
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
内存回收:
栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
申请效率:
栈:由系统自己分配,速度较快,但是程序员无法掌握。
堆:一般有两种方法来申请内存,new和malloc,new是一种用算符而malloc是函数。由程序员申请出来的内存一般速度比较慢,而却容易产生内存碎片,不过用起来比较方便,获取的空间大,也相对较灵活。
“java栈与堆是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。