NingG +

JVM 实践:GC 原理

1. 背景

从 14 年,第一次在团队中分享 JVM 的 GC 原理以及调优实践,17 年在美团分享一次,最近面向公司的支付技术团队又分享了一次,做了局部内容的更新。在美团那次,技术学院录了部分视频,美团的读者可以到 mit 上搜一下。18 年这次,围绕 JDK8 以及 G1 垃圾收集器,做了部分内容更新,这次集中放出来吧,准备 2 篇 blog 来描述 JVM GC 原理和调优实践。(自己有一个 keynote 版本

2. 主要内容

主要几个方面:

  1. 基本逻辑:
    1. Java 代码执行过程
    2. JVM 内存分配
    3. JVM 内存回收
  2. 实现细节:
    1. 整体策略:分代策略
    2. 垃圾收集器
  3. 实践:具体 JVM 调优的详细场景和操作

2.1. 基本逻辑

2.1.1. Java 代码执行过程

2.1.1.1. JVM 是什么

2.1.1.2. Java 代码执行过程

JVM 整体由 4 部分组成: 1. 加载:类加载器 ClassLoader 1. 执行:执行引擎 1. 内存:运行时数据区,Runtime Date Area 1. 内存回收:垃圾回收

2.1.2. 内存分配

2.1.2.1. 运行时数据区
  1. 方法区:
    1. 类:Class
    2. 静态变量
    3. 常量池(字符串常量、数字常量)
  2. Java 堆:
    1. 对象:Object
    2. 数组
  3. Java 栈:Java 方法调用过程
    1. 操作数栈
    2. 局部变量表
    3. 方法出口
  4. 本地方法栈:本地方法调用过程
  5. 程序计数器:Program Counter

2.1.2.2. 实例

JVM 内存空间:

  1. 线程共享:
    1. Java 堆
    2. 直接内存
    3. 方法区
  2. 线程独占:
    1. Java 栈
    2. 本地方案栈
    3. PC 寄存器

2.1.3. 内存回收

2.1.3.1. 为什么要回收内存
2.1.3.2. 回收哪些内存
2.1.3.3. 如何回收

核心问题二:如何回收?

分代回收:根据对象存活时间,分级策略

2.2. 实现细节

2.2.1. 简要

背景:

2.2.2. 具体的 GC 垃圾收集器

2.2.3. CMS 垃圾收集器(老年代)

2.2.4. G1 垃圾收集器(新生代、老年代)

G1,Garbage First:

2.2.5. CMS vs. G1

2.3. 实践:JVM 调优实践

单独进行一次分享和整理:

2.4. 补充

2.4.1. Young GC & Full GC

3. 讨论问题

讨论问题

4. 参考资料

Top