关于java中堆内存与栈内存的详细分析[通俗易懂]

本文由java零基础入门栏目为大家推荐,文中详细分析了什么栈内存与堆内存,并为大家介绍了二者的区别,希望可以帮助到大家。堆内存用于存储Java中的对象和数组,栈内存主要是用来执行程序用的。

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

关于java中堆内存与栈内存的详细分析[通俗易懂]

一、概述

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

二、堆内存

1、什么是堆内存?

堆内存是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。

2、堆内存的特点是什么?

第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队,好,你先买票。

第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。

3、new对象在堆中如何分配?

由Java虚拟机的自动垃圾回收器来管理。

免费视频教程分享:java视频教程

三、栈内存

1、什么是栈内存

栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量。

2、栈内存的特点

第一点:栈内存就好像一个矿泉水瓶,像里面放入东西,那么先放入的沉入底部,所以它的特点是:先进后出,后进先出

第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

3、栈内存分配机制

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

4、数据共享

例子:

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的值是不会发生改变的。

PS:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变。

四、栈和堆的区别

JVM是基于堆栈的虚拟机,JVM为每个新创建的线程都分配一个堆栈。也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

差异点:

1.堆内存用来存放由new创建的对象和数组。

2.栈内存用来存放方法或者局部变量等。

3.堆是先进先出,后进后出。

4.栈是后进先出,先进后出。

相同点:

1.都是属于Java内存的一种。

2.系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它。

更多相关文章教程分享:java零基础入门

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120806.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 交叉熵损失函数原理详解[通俗易懂]

    交叉熵损失函数原理详解[通俗易懂]交叉熵损失函数原理详解之前在代码中经常看见交叉熵损失函数(CrossEntropyLoss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,在模型的输出层总会接一个softmax函数,至于为什么要怎么做也是不懂,所以专门花了一些时间打算从原理入手,搞懂它,故在此写一篇博客进行总结,以便以后翻阅。交叉熵简介交叉熵是信息论中的一个…

    2022年6月26日
    31
  • 程序员应注意——米勒法则「建议收藏」

    程序员应注意——米勒法则「建议收藏」米勒(1956)提出,人脑同时只能处理7±2个信息团,这一发现被称为米勒法则。虽然学者们对于米勒法则所指的魔法数字究竟是多少仍有争议,人脑具有短期存储与信息处理限制这一事实已被学者们所公认。

    2022年8月3日
    2
  • 如何更换tomcat版本

    如何更换tomcat版本eclipse如何更换tomcat版本呢?其实很简单首先选中项目,右键,如图选中tomcat,点击删除按钮,如下图tomcat已经没有了,点击addlibrary…,然后添加serverruntime(tomcat环境),点击next按钮我安装了两个tomcat,选择自己本地需要的tomcat,点击finish按钮tomcat已经添加至项目里,点击ok看,项目里已经换过…

    2022年8月30日
    3
  • List去重3种方式

    List去重3种方式一、背景1.在实战中list去重是非常频繁的,下面就讲讲它的三种用法。二、第一种(原始代码去重)1.测试类publicclassDemoTest{publicstaticvoidmain(String[]args){ArrayList<String>list=Lists.newArrayList(“02″,”01”,”…

    2022年5月26日
    35
  • 华为电脑如何投屏到电视linux,华为手机如何投屏到电脑上?手把手教你,无线投屏怎么做…「建议收藏」

    原标题:华为手机如何投屏到电脑上?手把手教你,无线投屏怎么做经常宅在家里想要看电影,手机屏幕太小影响观看体验,或者需要投屏到电脑上,方便办公。这个时候应该怎么办?如果你使用的是华为手机,可以直接投屏到电视、电脑上,这里就来手把手教你如何操作。1、打开功能华为手机开启无线投屏的方式有2种:第1种是在手机设置内,选择更多链接,进入之后就可以开启无线投屏的功能;第2种是直接下拉通知栏,然后开启手机投…

    2022年4月9日
    117
  • MAX31856中文文档

    MAX31856中文文档MAX31856中文手册文件可到资源处下载

    2022年6月19日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号