关于JVM堆与栈(1)

堆和栈的区别

  1. 功能不同
    栈内存用来存储局部变量方法调用
    堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

  2. 共享性不同
    栈内存是线程私有的。
    堆内存是所有线程共有的。

  3. 异常错误不同
    如果栈内存或者堆内存不足都会抛出异常。

  • 栈空间不足:java.lang.StackOverFlowError。
  • 堆空间不足:java.lang.OutOfMemoryError。
  1. 空间大小
    栈的空间大小远远小于堆的。

栈的组成

栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。

常见误区

  1. Java中的基本数据类型一定存储在栈中吗?
    不一定。栈内存用来存储局部变量和方法调用。
  • 如果该局部变量是基本数据类型,例如
int a = 1;

那么直接将该值存储在栈中。

  • 如果该局部变量是一个对象,如
int[] array=new int[]{1,2};

那么将引用存在栈中而对象({1,2})存储在堆内

参考内容

猜你喜欢

转载自blog.csdn.net/qq_38337799/article/details/83118855