堆和栈

概念

在Java中,内存分为两种,一种是栈内存,另一种就是堆内存

堆内存

它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等,java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈内存

主要是用来执行程序用的,Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程,主要存放线程执行过程中的局部变量,方法的返回值,基本类型的变量(,int, short, long, byte, float, double, boolean, char)以及方法调用的上下文。栈空间随着线程的终止而释放,栈的优势是,存取速度比堆要快,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

栈内存可以称为一级缓存,由垃圾回收器自动回收

栈内存数据共享:

基本数据类型:

例子:
int a = 3;
int b = 3;

第一步处理:
1.编译器先处理int a = 3;
2.创建变量a的引用
3.在栈中查找是否有3这个值
4.没有找到,将3存放,a指向3

第二步处理:
1.处理b=3
2.创建变量b的引用
3.找到,直接赋值

第三步改变:
接下来
a = 4;
同上方法
a的值改变,a指向4,b的值是不会发生改变的

对象/引用类型:

String s1="123";
String s2="123";
String s3 = new String("123");
String s4 = new String("123");
System.out.println(s1.equals(s2));//true
System.out.println(s1==s2);//true
System.out.println(s3.equals(s4));//true
System.out.println(s3==s4);//false
//由于创建s1后,再创建s2,系统发现有一个123,就将s2地址指向s1

栈和堆的区别

  • 1.堆内存用来存放由new创建的对象和数组。
  • 2.栈内存用来存放方法或者局部变量等
  • 3.堆是先进先出,后进后出
  • 4.栈是后进先出,先进后出
  • 5.栈内存存储的是局部变量而堆内存存储的是实体;
  • 6.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  • 7.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

 

举例

public class Student {
    String name;
    static String city = "中国";

    public Student(String name) {
        this.name = name;
    }
}

public class Mainstatic {
    public static void main(String[] args) {
        Student student1 = new Student("李楠");
        Student student2 = new Student("张锋");

        student1.city = "美国";
        System.out.println(student1.city);//美国
        System.out.println(student2.city);//美国
    }
}

 

 

 

 

 

 

 

 

 

 

参考:https://blog.csdn.net/weixin_42528266/article/details/103094792

参考:https://blog.csdn.net/u011546655/article/details/52170470

 

posted @ 2021-10-26 16:13  夜柠檬  阅读(65)  评论(0)    收藏  举报