Java开发——6.内存分配(堆、栈以及参数的值传递+引用传递)

简介: 内存分配(堆、栈以及参数的值传递+引用传递)

内存:

内存是计算机中的重要原件,临时存储区域,作用是运行程序。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

必须放进内存中才能运行,运行完毕后会清空内存

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。


此处补充内存和硬盘的区别:

1.内存是指安装在系统板上的随机存取内存,而硬盘驱动器是磁盘的主轴,也称为硬盘。

2.内存容量范围从 128 MB 到 4 GB,而硬盘容量范围从 320 GB 到 1TB。

3.内存中的存储类型是临时的(如果一断电内存中的数据就会丢失),而硬盘中的存储类型是永远。

4.内存:不允许我们存储个人数据;而是用于存储计算机数据。它读取和写入数据,并且会继续保存在内存,除非系统关闭。硬盘是一种可预测的存储器,可以让用户存储和擦除数据;存储在硬盘上的所有数据在使用期间和使用后都不会自动清除。

拓展:

RAM,一般指随机存取存储器。

随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。RAM即大家常说的运行内存,简称运存,是一种在手机中用来暂时保存数据的元件,相当于电脑中的内存条。


Java中的内存分配

image.png


publicclassDemo{
publicstaticvoidmain(String []args){
intnum=5;
intarr [] =newint []{1,2,3};
    }
}


栈内存:一般存放基本数据类型的值;当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。


堆内存:一般存放引用数据类型的值;在栈中存储的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。

例如:

int arr [] = new int []{1,2,3};

int sum = arr[2]; sum就是一个变量。

而数组和对象本身仍存放在堆内存中,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在一个不确定的时间被垃圾回收器释放掉才能彻底释放内存。

这个也是Java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

image.png



值传递的本质:

在参数传递的过程中,原来参数值不会发生改变!



publicstaticvoidmain(String[] args) {
//num 就是实参:实参是定义在方法之外类之中intnum=15;
System.out.println("值传递之前:"+num);
zhiChuanDi(num);
System.out.println("值传递之后:"+num);
}
publicstaticvoidzhiChuanDi(intnumber){
//此处的number 就是形参:形参是定义在方法之中的number=150;
    }

图解分析:

主要原因:方法存储在栈内存中的,栈内存中的方法会随着方法的调用完成而消失;所以尽管num被当做参数传进了zhiChuanDi()的有参方法中,并且发生了重赋值的步骤,但是整个过程并不会影响原来的num实参。相当于复制了一份num,并把复制后的num当做形参传递给了zhiChuanDi()的有参方法,实际的num是不变的。


image.png


引用传递的本质:

在进行参数传递的过程中,发生了参数值的改变。


publicstaticvoidmain(String[] args) {
intarr[] =newint[]{12,18,20};
System.out.println("引用传递之前:"+arr[0]);
yinYongChuanDi(arr);
System.out.println("引用传递之后:"+arr[0]);
Stringstr="小红";
System.out.println("引用传递之前:"+str);
yinYongChuanDi2(str);
System.out.println("引用传递之后:"+str);
    }
publicstaticvoidyinYongChuanDi(int []arr){
arr[0] =66;
    }
publicstaticvoidyinYongChuanDi2(Stringstr){
str="小明";
    }

图解分析:

这个过程相当于,人的名字一样;大多数人的名字都会重复,但是每个人对应的身份证是不同的!因为new对象,对象的值是存在于堆内存中的,要想获取堆内存中的具体指,是通过底层的地址值进行访问的,所以以参数传过去的arr数组,实际上是传的一个具体实际的arr数组,所以对arr[0]进行参数重赋值的过程,是对底层堆内存中的数据进行修改的;所以数据在进行参数传递的过程中发生了改变。

image.png

但是:我下面举了一个例子,是String类型的字符串,在进行参数的传递过程中,值并没有发生改变。虽然String类型也是引用数据类型,但是他发生参数传递的过程相当于基本数据类型,因为他并没有new一个对象!所以此处的String为特殊例子。

相关文章
|
12天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
19 0
|
11天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
14天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
11天前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
25 0
|
22天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
173 1
|
20天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
21天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
19 3
|
22天前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
44 1
|
1月前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
74 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS