玩转JVM的GC 和 GC 调优 —— 实战
GC 基础知识
1、什么是垃圾
C语言申请内存:malloc、free
C++: new、delete
Java: new、自动回收
自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型的问题:
- 忘记回收
- 多次回收
2、如何定位垃圾
- 引用计数
- 根可达算法
3、常见的垃圾回收算法
标记清除:位置不连续,产生内存碎片
复制算法:没有内存碎片,浪费空间
标记压缩:没有内存碎片,效率偏低
4、JVM内存分代模型(用于分代垃圾回收算法)
- 部分垃圾回收器使用的模型
- 新生代 + 老年代 + 永久代(1.7)/ 元数据区(1.8)Metaspace
- 永久代元数据-Class
- 永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于物理内存)
- 字符串常量1.7 - 永久代,1.8 - 堆
- MethodArea 逻辑概念 - 永久代、元数据
- 新生代 = Eden + 2个suvivor区
- minor_gc回收之后,大多数的对象会被回收,活着的对象进入s0
- 再次minor_gc,活着的对象从 eden + s0 进入 s1
- 再次minor_gc,活着的对象从 eden + s1 进入 s0
- 年龄足够 进入 老年代 (Parallel 15次,CMS 6次)
- suvivor 区装不下,直接进入老年代
- 老年代
- 顽固分子
- 老年代满了 Major_gc,Full GC
- GC 调优
- 尽量减少Full GC
- Minor GC = YGC
- Major GC = FGC
5、常见的垃圾回收器
- Serial 年轻代 单线程串行回收
- Parallel Scavenge 简称PS 年轻代 多线程并行回收
- ParNew 年轻代 配合CMS的并行回收
- Serial Old 老年代 单线程串行回收
- Parallel Old 老年代 多线程并行回收
- ConcurrentMarkSweep 老年低多线程并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms)
- G1(10ms)
- ZGC(1ms) 可以和C++ PK
- Shenandoah
- Eplison
JDK1.8 默认的垃圾回收器:Parallel Scavenge + Parallel Old
6、JVM调优第一步,了解生产环境下的垃圾回收器组合
- JVM 的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
- JVM 参数分类:
- 标准:- 开头,所有的HotSpot都支持
- 非标准:- 开头,特定版本HotSpot支持特定命令
- 不稳定:-XX 开头,下个版本可能取消
- 常用:
- -XX:+PrintFlagsFinal 设置值(最终生效值)
- -XX:+PrintFlagsInitial 默认值
- -XX:+PrintCommandLineFlags 命令行参数
参考资料:
- 垃圾回收器:https://blogs.oracle.com/jonthecollector/our-collectors
- JVM 的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
文章最后,给大家推荐一些受欢迎的技术博客链接:
- JAVA相关的深度技术博客链接
- Flink 相关技术博客链接
- Spark 核心技术链接
- 设计模式 —— 深度技术博客链接
- 机器学习 —— 深度技术博客链接
- Hadoop相关技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
- 深入聊聊Java 垃圾回收机制【附原理图及调优方法】
欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!