Java基础JVM中堆和栈理解
教程分享
>
Java教程
(1525)
2024-04-17 12:33:22
一.概述
在Java中,内存主要分为两种,一种是栈(
stack)内存,另一种就是堆内存(
heap)(
某些情况下说的堆栈内存是指栈内存)。
二.堆内存
2.1什么是堆内存?
堆内存(
heap)是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。
2.2.堆内存的特点
- 堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队,好,你先买票。
- 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。
三.栈内存
3.1什么是栈内存
栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量
实际上是
只有一个出入口的队列,即后进先出(First In Last Out),先分配的内存必定后释放。一般由,由系统自动分配,存放存放函数的参数值,局部变量等,自动清除。
还有,堆是全局的,堆栈是每个函数进入的时候分一小块,函数返回的时候就释放了,静态和全局变量,new 得到的变量,都放在堆中,局部变量放在堆栈中,所以函数返回,局部变量就全没了。
其实在实际应用中,堆栈多用来存储方法的调用。而对则用于对象的存储。
JAVA中的基本类型,其实需要特殊对待。因为,在JAVA中,通过new创建的对象存储在“堆”中,所以用new 创建一个小的、简单的变量,如基本类型等,往往不是很有效。因此,在JAVA中,对于这些类型,采用了与C、C++相同的方法。也就是说,不用new 来创建,而是创建一个并非是“引用”的“自动”变量。这个变量拥有它的“值”,并置于堆栈中,因此更高效。
3.2栈内存的特点
- 栈内存就好像一个矿泉水瓶,像里面放入东西,那么先放入的沉入底部,所以它的特点是:先进后出,后进先出;
- 存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性;
- 栈内存可以称为一级缓存,由垃圾回收器自动回收;
- 栈数据可以共享;
四.区别
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
相同点:
- 都是属于Java内存的一种
- 系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它
不同点:
- 堆内存用来存放由new创建的对象和数组。
- 栈内存用来存放方法或者局部变量等
- 堆是先进先出,后进后出
- 栈是后进先出,先进后出
五.举个栗子说明
- 比较类里面的数值是否相等时,用equals()方法;
- 当测试两个包装类的引用是否指向同一个对象时,用==
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true
https://www.leftso.com/article/295.html