【Java开发】Java的内存
首先
大家好!
DreamHanks有254厘米高。
在之前的Java文章中已经逐渐提及了这一点。
我打算简单地处理一下之前没有处理过的内存。
以下是Java文章的摘要。
Java虚拟机
在讨论内存之前,需要先了解JVM这个东西。
JVM是Java Virtual Machine的简写,用于实际执行Java程序。
JVM不受CPU或操作系统的限制,可以执行Java程序。
JVM的内部包含了类加载器、执行引擎、垃圾回收器和运行时数据区等组件。
本节中只涉及“垃圾收集器”和“运行时数据区域”,即使有其他组成部分。
垃圾收集员
垃圾收集器负责JVM的内存管理。
垃圾收集器是用于清理不再使用的对象内存的工具。
运行时数据区
当Java程序运行时,运行时数据区是存储实际数据的空间。
这个空间被分为Method区域、Heap区域、Stack区域、PC寄存器区域和本地方法栈区域。
本次只涉及Method、Heap和Stack区域。
方法领域
方法领域是收集类信息的地方。
类的字段变量的名称、数据类型、访问控制信息等字段信息。
方法的名称、返回值的数据类型、参数、以及访问修饰符之类的方法信息。
这是储存静态变量、final类变量等的区域。
在这里,静态变量在JVM执行Java程序时被分配内存。
当程序结束时,内存将被释放。
因此,static变量在程序执行期间保持生成并可在任何地方使用。
堆领域
虽然堆的领域可以细分为几个部分进行详细解释,但本次将忽略这些。
堆领域是存储由new生成的对象和数组数据的区域。
样本
public class ExampleCalss {
public static void main(String[] args) {
Human human = new Human();
}
}
class Human {
int age;
String name;
}
类字段的信息存储在方法区。
当在新的类中调用构造函数时,将生成一个实例,并将其存储在堆内存中。
在那时,每个实例都能够分配内存并将值赋给字段。
Heap区域中垃圾回收器的职责。
垃圾收集器会删除无人使用的内存空间。
样本
public class ExampleCalss {
public static void main(String[] args) {![20200929 Heap 영역 첨부자료2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/f85e9c28-dbe5-db5d-edd1-6a75a4b54065.png)
Human human = new Human();
human = null;
human = new Human();
}
}
class Human {
int age;
String name;
}
看到上面的示例,人为地将内存地址指向 null。
然后创建一个新的human实例并将其引用。
换言之,分配给第一个实例的没有被任何人引用。
这种内存空间(第一个实例)将成为垃圾回收的目标。
※垃圾回收(Garbage Collection)表示垃圾收集器清除不被任何引用的内存操作的意思。
堆栈领域
局部变量、参数、返回值等数据存储区域。
在堆栈领域中,基本类型的变量存储着变量本身以及其数据。
参照型(对象)只存储实例的地址,而实际的数据存储在堆内存中。
每次调用方法时,Stack领域都会个别创建。
样品
public class ExampleCalss {
public static void main(String[] args) {
int age = 10;
age = mutiply(age, 4);
}
static int mutiply(int num1, int num2) {
int result = num1*num2;
return result;
}
}
如果要按顺序说明上述的情况(忽略args),则:
在Java中,会创建main方法的堆栈空间。
② 年龄被生成并初始化为10。
③ 调用multiply方法,生成了一个栈空间。
④ multiply的参数被生成并用传递的值初始化。
5. 生成value并将计算结果赋值。
⑥ 执行return并结束multiply的执行。然后,在Stack中删除multiply使用的变量。
⑦ multiply方法的执行结果将被分配给age。
当 main 方法结束时,main 方法中使用的变量将被删除。
结束。
本次文章至此结束。
谢谢您的光临。
接下来的文章将在DreamHanks的博客上连载。
你们可以在这里查看我们的最新文章。