目录
前言:
1.JVM(java虚拟机)主要包括三块内存空间,分别是栈内存,堆内存,方法区内存,大致的功能记住以下的图便可。
栈内存 局部变量(本地变量) 方法调用 括号匹配 | 堆内存 实例变量 对象创建(有new) 处理动态数组 | 方法区内存 静态变量 二进制代码片段 维护常量池 |
▲需要注意的是:jdk8以后的方法区被元空间和一部分到堆里的功能代替了,只是方便理解所以还叫方法区
2.详细内存分配的作用:
栈:方法调用和返回、括号匹配等。
堆:对象的创建、动态数据结构、动态数组和集合、java虚拟机的数据管理等。
方法区:储存类的信息、常量池、静态变量、编译后的二进制代码。
本地方法栈:调用本地方法、连接Java和本地代码库、支持操作系统和硬件相关功能。每个线程都有自己的本地方法栈。
寄存器:位于CPU中的高速存储器,用于存储指令执行时需要的数据、地址和操作数。在运算、存储变量和临时值、快速调用函数时可以提高工作效率,减少对内存的频繁访问。
一.栈:
方法代码片段执行的时候,会给该方法分配内存空间,在栈内存中压栈。可以存放基本的变量数据,和new对象的地址。
1.方法调用的时候,该方法所需要的内存空间在栈内存中分配,称为“压栈”,方法执行后,该方法所属的内存空间释放,称为“弹栈”。
2.栈中主要储存的是方法体中的局部变量。
3.三块内存当中变化最频繁的是栈内存,最先有数据的是方法区内存,垃圾回收器主要针对的是堆内存。
二.堆:
存放new的对象和数组,可被所有的线程共享。
1.在程序执行的过程中,使用new运算符创建java对象,储存在堆内存中,对象内部有实例变量,所以实例变量储存在堆内存中。
▲由栈堆的数组储存举例:
三.方法区:
在类加载时,class和static都可以被加载到该内存空间当中。可以被所有线程共享。
1.方法的代码片段以及整个类的代码片段都被以二进制的形式储存在方法区内存当中,在类加载的时候这些代码片段会载入。
四:变量分类:
1 •局部变量:指的是在方法(C语言中叫函数)中或者方法上定义的变量,没有初始值,所以必须先初始化才能使用【方法体中声明】
作用范围:在开始定义的位置开始,到紧跟着结束的花括号为止。
2 •成员变量:指的是在类里定义的变量,默认是有初始值的【方法体外声明】
作用范围:在整个类中都有效。
例:
class test
{
String a = null;//成员变量
void test1(String name)
{
int age;//局部变量
}
}
2.1•实例变量(属于成员变量):定义在类中方法外,在JVM中属于堆内存中,声明时有默认的初始化值。【无static修饰】
2.2•静态变量(属于成员变量):定义在类中方法外,用static修饰,在JVM中属于方法区内存,声明时有默认的初始化值。【有static修饰】
▲注意:(以下为搬运部分,请支持原作,点击支持)
成员变量的两种细分类型的区别:
静态变量和局部变量都属于成员变量,那么如何选择合适的类型呢?下面就来谈一下这两者的区别和使用方法。
静态变量,顾名思义就是静止不变的变量,在对象中对于同一个成员变量的数值都一样时,例如定义一个中国人类,每个人的国籍都是中国,就没必要每一个对象中存一份,这样就可以把数据抽离出来将其用静态变量表示,用static修饰。
调用方式:
实例变量只能通过对象名调用,静态变量可以使用类名调用,也可以使用对象名调用,但是不推荐使用对象名调用。
变量在使用过程中还需注意以下几点:
定义同名问题:
同一个域中局部变量不能定义为相同的名字,会报错;
同一个域中成员变量也不能定义为相同的名字,会报错
局部变量和成员变量定义的名字可以相同,使用过程中遵循就近原则;
作用域问题
变量的有效范围以大括号为标准,在定义的大括号范围内有效,出了大括号就不认识了。
NO.6
完结撒花🌷
如有问题,请及时联系作者更正喔!