堆内存与栈内存

java的内存分为堆内存和栈内存

栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。

堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

JVM空间分配

heap是堆:1、手动申请和释放空间     2、大自由区

stack是栈:1、自动分配和释放    2、空间有限

例:在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。

Object a=null;只在栈中分配内存。

new Object();在堆中分配空间。

Object b =new Object();在栈中分配空间,指向堆中的地址。

内存中堆栈的关系

Heap是 Stack的一个子集。

Stack存取速度仅次于寄存器,存储效率比heap高,可共享存储数据,但是其中数据的大小和生存期必须在运行前确定。

Heap是运行时可动态分配的数据区,从速度看比Stack慢,Heap里面的数据不共享,大小和生存期都可以在运行时再确定。

new关键字 是运行时在Heap里面创建对象,每new一次都一定会创建新对象,因为堆数据不共享。

回收上区别

Stack的内存管理是顺序分配的,而且定长,不存在内存回收问题

Heap 则是随机分配内存,不定长度,存在内存分配和回收的问题

在JVM中另有一个GC进程,定期扫描Heap ,它根据Stack中保存的4字节对象地址扫描Heap ,定位Heap 中这些对象,进行一些优化(例如合并空闲内存块什么的),并且假设Heap 中没有扫描到的区域都是空闲的,统统refresh(实际上是把Stack中丢失了对象地址的无用对象清除了),这就是垃圾收集的

猜你喜欢

转载自blog.csdn.net/weixin_42201566/article/details/83245985