java的栈内存和堆内存_Java本地方法栈

java的栈内存和堆内存_Java本地方法栈Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

介绍Java语言有关内存分配的知识。Java语言把内存分为两种:栈内存堆内存

栈内存

在方法中定义的一些基本类型的变量对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立刻被另作他用。

堆内存

堆内存用来存放由 new 运算符创建的数组或对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。引用变量就相当于是为数组或对象起的一个名称。而数组或对象本身在堆内存中分配,即使程序运行到使用 new 运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会被释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。

Java有一个特殊的引用型常量null,如果将一个引用变量赋值为null,则表示该引用变量不指向(引用)任何对象。


下面通过一个数组案例进行演示,以对栈内存和堆内存有更深的了解。

一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需要先声明数组;分配空间;创建数组元素并赋值。

数据类型 [] 数组名;             //声明一维数组

数组名 = new 数据类型[个数];    //分配内存给数组

在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java语言中任意的数据类型,包括基本类型和引用类型。

与C/C++语言不同,Java语言在数组的定义中并不为数组元素分配内存,因此“[]”中不用给出数组中元素的个数(即数组的长度),但必须在为它分配内存空间后才可使用。

数组声明之后,接下来就要分配数组所需的内存,这时必须用运算符new,利用new运算符为数组元素分配内存空间的方式称为动态内存分配方式

int [] x;    //声明名称为x的int型数组
x = new int[10]; //x数组中包含有10个元素,并为这10元素分配内存空间

在声明数组时,也可以将两个语句合并成一行,格式如下:

数据类型 [] 数组名 = new 数据类型[个数];
int [] x = new int[10];

等号左边的 “int [] x ”相当于定义了一个特殊的变量x,x的数据类型是一个对 int 型数组对象的引用,x就是一个数组的引用变量,其引用的数组元素个数不定。等号右边的 “new int[10]” 就是在堆内存中创建一个具有10个int型变量的数组对象。其意义就是将右边的数组对象赋值给左边的数组引用变量。

这里我们先声明一个数组,例如:

int [] x;  //定义了一个数组x

这条语句执行完成后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。

x = new int[10];  //初始化数组

这条语句执行完后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

声明数组并分配相应的内存空间,引用变量指向数组对象

执行“x=new int[10];”后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。

用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null赋给x即可。如执行“x = null;”语句后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

执行完“x = null;”语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。


感谢大家的耐心阅读,如有建议请私信或评论留言

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

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

(0)
上一篇 2025年9月3日 下午1:15
下一篇 2025年9月3日 下午1:43


相关推荐

  • 数据分析方法论和数据分析方法的区别(数据分析理论)

    如何理解数据分析的方法论问题?首先,数据分析方法论就如同国家的方针政策,指导和决策我们分析的方向。从宏观角度知道如何进行数据分析,就像是一个数据分析的前期规划,知道着后期数据分析工作的开展。数据分析法则就是指具体的分析方法,例如我们常见的对比分析、交叉分析、相关性分析、回归分析、聚类分析等数据分析法,数据分析法则是从微观角度指导我们如何进行数据分析。那么,数据分析方法论的作用有什么呢?…

    2022年4月15日
    41
  • 网络管理员需要会什么_网络管理员好做吗

    网络管理员需要会什么_网络管理员好做吗JeffDray最近经过对IT行业的深入调查研究,通过总结和分析针对IT行业列出了一份类别名单。在这里,他定义了七类最不安全的网络管理员。如果你是一名网络管理员,并且已经意识到工作中还存在着不足,看看你属于名单中的哪一类?  大多数网络管理员对工作游刃有余,并且可以在一个具有高度挑战和技术难度的任务中,使工作顺利进行。然而,有时他们中的某些人会变得很难缠,并会阻碍事情的顺利进行。所以,我定义了

    2022年4月19日
    50
  • FontIcon — Web开发的新选择

    FontIcon — Web开发的新选择FontIcon 即字体图标 是随着 CSS3 被广泛应用后出现的一个新事物 我们知道之前开发 Web 应用 字体家族就只能是固定的那些所谓 Web 安全字体 浏览器支持 CSS3 之后 就可以通过关键字 font face 支持自定义字体了 这就衍生了一个新功能 用字体来代替图片 以往 Web 里的图片只能是正式的图片 图片一旦设计好 大小和配色就固定了 放大图片很容易失真 字体代替图片后带来的好处很明显 减少图片量

    2026年3月16日
    2
  • DWARF调试格式的简介

    DWARF调试格式的简介https blog csdn net wuhui gdnt article details DWARF 调试格式的简介 MichaelJ Eager EagerConsult 2007 翻译 吴晖 2012 年 2 月如果我们可以编写确保能正确工作且永远不需要调试的程序 这将非常美妙 在梦想成真之前 通常的编程周期还将是包括 编写一个程序 编译它

    2026年3月19日
    2
  • Validation异常:No validator could be found for constraint ‘…..’ validating type ‘java.lang.Integer’.

    Validation异常:No validator could be found for constraint ‘…..’ validating type ‘java.lang.Integer’.nbsp javax validation UnexpectedTy HV000030 Novalidatorc javax validation constraints Pattern validatingty java lang Integer Checkconfigu

    2026年3月18日
    2
  • 企业级智能体怎么用?金智维Ki-AgentS三大场景演示一看就懂

    企业级智能体怎么用?金智维Ki-AgentS三大场景演示一看就懂

    2026年3月15日
    2

发表回复

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

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