玩转JVM的GC 和 GC 调优 —— 实战

GC 基础知识

1、什么是垃圾

C语言申请内存:malloc、free

C++: new、delete

Java: new、自动回收

自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型的问题:

  1. 忘记回收
  2. 多次回收

2、如何定位垃圾

  1. 引用计数
  2. 根可达算法

3、常见的垃圾回收算法

标记清除:位置不连续,产生内存碎片

玩转JVM的GC 和 GC 调优 —— 实战_第1张图片

复制算法:没有内存碎片,浪费空间

玩转JVM的GC 和 GC 调优 —— 实战_第2张图片

标记压缩:没有内存碎片,效率偏低

玩转JVM的GC 和 GC 调优 —— 实战_第3张图片


4、JVM内存分代模型(用于分代垃圾回收算法)

玩转JVM的GC 和 GC 调优 —— 实战_第4张图片

 分代垃圾回收流程

玩转JVM的GC 和 GC 调优 —— 实战_第5张图片

  1. 部分垃圾回收器使用的模型
  2. 新生代 + 老年代 + 永久代(1.7)/ 元数据区(1.8)Metaspace
    1. 永久代元数据-Class
    2. 永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于物理内存)
    3. 字符串常量1.7 - 永久代,1.8 - 堆
    4. MethodArea 逻辑概念 - 永久代、元数据
  3. 新生代 = Eden + 2个suvivor区
    1. minor_gc回收之后,大多数的对象会被回收,活着的对象进入s0
    2. 再次minor_gc,活着的对象从 eden + s0 进入 s1
    3. 再次minor_gc,活着的对象从 eden + s1  进入 s0
    4. 年龄足够 进入 老年代 (Parallel 15次,CMS 6次) 
    5. suvivor 区装不下,直接进入老年代
  4. 老年代
    1. 顽固分子
    2. 老年代满了 Major_gc,Full GC
  5. GC 调优
    1. 尽量减少Full GC
    2. Minor GC = YGC; Young GC Minor GC;  Eden 区不足
    3. Major GC = FGC; Old空间不足,System.gc()

5、常见的垃圾回收器

玩转JVM的GC 和 GC 调优 —— 实战_第6张图片

玩转JVM的GC 和 GC 调优 —— 实战_第7张图片

玩转JVM的GC 和 GC 调优 —— 实战_第8张图片

玩转JVM的GC 和 GC 调优 —— 实战_第9张图片

  1. Serial 年轻代 单线程串行回收
  2. Parallel Scavenge 简称PS 年轻代 多线程并行回收
  3. ParNew 年轻代 配合CMS的并行回收
  4. Serial Old 老年代 单线程串行回收
  5. Parallel Old 老年代 多线程并行回收
  6. ConcurrentMarkSweep 老年低多线程并发的,垃圾回收和应用程序同时运行,降低STW的时间(200ms)
  7. G1(10ms)
  8. ZGC(1ms) 可以和C++ PK
  9. Shenandoah
  10. 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    命令行参数

参考资料:

  1. 垃圾回收器:https://blogs.oracle.com/jonthecollector/our-collectors
  2. JVM 的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html

 


文章最后,给大家推荐一些受欢迎的技术博客链接

  1. JAVA相关的深度技术博客链接
  2. Flink 相关技术博客链接
  3. Spark 核心技术链接
  4. 设计模式 —— 深度技术博客链接
  5. 机器学习 —— 深度技术博客链接
  6. Hadoop相关技术博客链接
  7. 超全干货--Flink思维导图,花了3周左右编写、校对
  8. 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
  9. 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
  10. 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
  11. 深入聊聊Java 垃圾回收机制【附原理图及调优方法】

欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!

                                           

       

 

你可能感兴趣的:(Java,-,核心掌握,java,jvm)