Java基础JVM中堆和栈理解

位置:首页>博客>详情   分类:Java教程   阅读(144)   2023-03-28 11:29:14

一.概述

在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