堆和栈
概念
在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
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号