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线程进行垃圾回收 并且在垃圾回收过程中暂停其他工作线程 标记-复制-清除
ParNew jdk1.3 新生代 Serial的多线程版本 标记-复制-清除
Parallel Scavenge jdk1.4 新生代 追求CPU吞吐量的优化 能在较短的时间内完成指定的任务 标记-复制-清除
Serial Old jdk1.3 老年代 单线程 暂停应用程序执行 标记-整理
Parallel Old jdk1.5 老年代 多线程 和用户线程并发 标记-整理
CMS(concurrent mark sweep) jdk1.4 老年代 初始标记(停) 并发标记(运) 重新标记(运) 并发清除 标记-清除
G1 jdk1.7引入 jdk1.9默认 老年代 重新标记阶段停止业务线程 软实时 内存划分变为Region并评估每个region价值 首先清除垃圾最多的区域 标记-整理
相关推荐
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试
ID_1800790547312 小时前
小红书评论 API 接口详解与实战开发
java·jvm·c++
東雪木13 小时前
JVM 与 Java 内存模型 专属复习笔记
java·jvm·笔记·java面试
Undergoer_TW17 小时前
Colmap 进军嵌入式:SQLite 数据库从崩溃退出到自动治愈
jvm·数据库·sqlite
骄马之死17 小时前
ThreadLocal 核心原理
java·jvm·算法
一只小白00018 小时前
【JVM | 第二篇】—— 类加载器 & 双亲委派模型
jvm
Nyarlathotep011318 小时前
自动内存管理(3):HotSpot中垃圾收集的实现
jvm·后端
仍然.19 小时前
浅谈JVM
jvm
小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试