最近有比较多的粉丝说想学习java,或者正在上学,或者刚开始培训,或者在面试,希望我整理出一份可以在空闲的时候看的干货!!

下面,你们要的干货来了,一篇就是一个知识点,可以随时随地打开手机看看,面试,学习必备。关注我哦!

所有的java程序在运行时,都要在内存中开辟一个空间,并且在JVM(java虚拟机)运行的时候,会分得更加的细致,虚拟机中每一片内存的处理方式都是不一样的,所以需要进行单独的管理。

JVM的内存一共分为5种:

寄存器,本地方法区,方法区,堆内存,栈内存

今天我们主要讲堆内存与栈内存。

栈内存:

栈内存主要储存的是局部变量,也就是说,是定义在方法之内的,都叫局部变量。线程执行的时候调用方法的内存模型,当方法执行的时候,会创建一个叫“栈帧”的内存结构,栈帧会储存该方法内用到的局部变量表,操作数栈、返回地址、动态连接等信息。(这里新手主要了解局部变量表与返回地址就好了,局部变量表顾名思义是用来储存局部变量的,方法返回地址,是指方法在运行过程中,可能会正常退出,也可能会异常退出,但是不管哪种退出方式,都要让调用者知道方法退出的位置,方法返回地址就是用来确定退出位置的。)一个方法从方法被调用开始,到方法执行结束,就是一个栈帧在java栈中从入栈到出栈的全过程。

堆内存:

堆内存储存的是对象,也就是new出来的都在堆里,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

通俗一点说堆和栈的区别:堆主要用来存放对象的,栈主要用来执行程序的。

那么栈和堆有什么不同呢,我们可以从几个方面看待他们的不同!

顺序:

栈是先进后出,堆是先进先出

缓存:

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

内存回收:

栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

申请效率:

栈:由系统自己分配,速度较快,但是程序员无法掌握。

堆:一般有两种方法来申请内存,new和malloc,new是一种用算符而malloc是函数。由程序员申请出来的内存一般速度比较慢,而却容易产生内存碎片,不过用起来比较方便,获取的空间大,也相对较灵活。

每天抽出空闲的时间多看一点点。相信我,你会变得更强。