• JVM的内存分配及垃圾回收


    内存分配

    在了解Java的内存管理前,需要知道JVM中的内存分配。
    在这里插入图片描述

      • 存储局部变量。在方法的定义中或在方法中声明的变量为局部变量;栈内存中的数据在该方法结束(返回或抛出异常或方法体运行到最后)时自动释放
      • 栈中存放的数据结构为栈帧。当前线程每执行一个方法就会向栈中插入一个栈帧。栈帧封装了方法的局部变量表、动态链接信息、方法返回地址、操作数栈
      • 栈溢出报错:StackOverFlowError
      • Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间。
      • 堆中存储的是对象
      • 堆是JVM为每个进程创建的,该进程的所有线程都共享该堆内存。
      • 堆内存又可分为:新生代、老年代;新生代又可分为伊甸区(Eden)和幸存者区(Survivor),新生代:老年代=1:2;Eden:Survivor From:Survivor To=8:1:1
      • 伊甸区为新创建对象的存储区,当经历过第一次垃圾回收后存活下来的对象移入Survivor区,当新生代中的某些对象存活时间达到一定长度后移入老年区。
      • 当堆内存满时报错:OutOfMemoryError
    • 方法区
      • 方法区是JVM 所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等
      • 永久代:JDK7及之前,HotSpot虚拟机对方法区的一个实现,在JDK8被移除
      • 元空间:JDK8及之后,HotSpot虚拟机对方法区的实现。
      • 永久代存在于JVM虚拟机之中,可以理解为存在堆内存中;元空间则存在本地内存中

    垃圾回收

    垃圾回收器版本适用范围特点算法
    Serial(串行收集器)jdk1.1新生代只会使用一个CPU或者一条GC线程进行垃圾回收
    并且在垃圾回收过程中暂停其他工作线程
    标记-复制-清除
    ParNewjdk1.3新生代Serial的多线程版本标记-复制-清除
    Parallel Scavengejdk1.4新生代追求CPU吞吐量的优化
    能在较短的时间内完成指定的任务
    标记-复制-清除
    Serial Oldjdk1.3老年代单线程 暂停应用程序执行标记-整理
    Parallel Oldjdk1.5老年代多线程 和用户线程并发标记-整理
    CMS(concurrent mark sweep)jdk1.4老年代初始标记(停) 并发标记(运)
    重新标记(运) 并发清除
    标记-清除
    G1jdk1.7引入
    jdk1.9默认
    老年代重新标记阶段停止业务线程 软实时
    内存划分变为Region并评估每个region价值 首先清除垃圾最多的区域
    标记-整理
  • 相关阅读:
    spring5.0 源码解析 createBeanInstance 09
    跟TED演讲学英文:Entertainment is getting an AI upgrade by Kylan Gibbs
    java项目接口重复提交解决方案
    FFmpeg入门详解之16:音频编码原理
    力扣爆刷第126天之动态规划五连刷(斐波那契、爬楼梯、不同路径)
    Ubuntu24.04安装中文输入法
    洛谷P2196 [NOIP1996 提高组] 挖地雷【动态规划思路分析】看完直接举一反三!
    vim 入门
    2024牛客寒假算法基础集训营1(补题)
    python(11)例题重写
  • 原文地址:https://blog.csdn.net/qq_57689612/article/details/132975926