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

相关文章
Java基础JVM中堆和栈理解,收集各大网站各大牛人的语录,在Java中,内存主要分为两种,一种是栈(stack)内存,另一种就是堆内存(heap)(某些情况下说的堆栈内存是指栈内存)。
Java如何复制目录,Java基础教程系列,如果要将目录及其包含的所有子文件夹和文件从一个位置复制到另一个位置,请使用下面的代码,该代码使用递归遍历目录结构,然后使用Files.copy()函数...
在这篇快速文章中,我们将介绍使用标准框架 - JSR 380(也称为Bean Validation 2.0)来验证Java bean的基础知识。当然,在大多数应用程序中验证用户输入是超常见的需求...
Java基础多线程之主线程等待子线程结束,Java基础编程之多线程入门学习篇。主要讲解几种方法来实现Java多线程中主线程等待子线程结束的最快方式。
       在使用微服务架构中,我们已经克服许多微服务架构导致的遗留问题,它允许我们创建稳定的分布式应用程序,并对代码、团队规模、维护、发布周期、云服务等进行所需的控制
java基础编程中float/double类型的正确比较方法
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
java编程之Ehcache3.x 缓存过期时间Java配置demo
Java编程之spring boot FastDFS Java client使用,Java编程,FastDFS Java客户端
Java编程软件有哪些?常用Java编程软件下载、安装和使用说明
java8 Function函数编程详解Function函数基础定义和使用 public static void t1(){ Function<Integer,Int...
Java正则表达式基础使用packageorg.xqlee.utils.regular;importjava.util.regex.Matcher;importjava.util.regex.P...
Java编程之Spring Cloud Hystrix Circuit熔断/断路
Vert.x java 入门,Vert.x这个框架在常规的web业务开发中估计还不是很成熟。但是了解了他的一些原理我觉得可以有一番作为。今天主要简单讲解下eclipse Vert.x是什么有什么...