跳至主要內容
JVM2 - 内存管理1

JVM内存管理

在传统的C/C++开发中,我们经常通过使用申请内存的方式来创建对象或是存放某些数据,但是这样也带来了一些额外的问题,我们要在何时释放这些内存,怎么才能使得内存的使用最高效

因此,内存管理是一个非常严肃的问题。

比如我们就可以通过C语言动态申请内存,并用于存放数据:

#include <stdlib.h>
#include <stdio.h>

int main(){
    //动态申请4个int大小的内存空间
    int* memory = malloc(sizeof(int) * 4);
    //修改第一个int空间的值
    memory[0] = 10;
    //修改第二个int空间的值
    memory[1] = 2;
    //遍历内存区域中所有的值
    for (int i = 0;i < 4;i++){
        printf("%d ", memory[i]);
    }
    //释放指针所指向的内存区域
    free(memory);
    //最后将指针赋值为NULL
    memory = NULL;
}

codejavajvm大约 7 分钟
JVM2 - 内存管理2

JVM内存管理

区域划分

堆是整个Java应用程序共享的区域,也是整个虚拟机最大的一块内存空间

此区域的职责就是存放和管理对象和数组,而我们马上要提到的垃圾回收机制也是主要作用于这一部分内存区域。

方法区

方法区也是整个Java应用程序共享的区域,它用于存储所有的类信息、常量、静态变量、动态编译缓存等数据

可以大致分为两个部分,一个是类信息表,一个是运行时常量池


codejavajvm大约 9 分钟
JVM2 - 内存管理4 (垃圾回收)

垃圾回收机制

我们前面提到,Java会自动管理和释放内存,它不像C/C++那样要求我们手动管理内存,JVM提供了一套全自动的内存管理机制,当一个Java对象不再用到时,JVM会自动将其进行回收并释放内存,那么对象所占内存在什么时候被回收,如何判定对象可以被回收,以及如何去进行回收工作也是JVM需要关注的问题。

对象存活判定算法


codejavajvm小于 1 分钟