大厂学院 - JVM与GC调优【百度盘】



  • 什么是垃圾

    • C语言申请内存:malloc、free
    • C++: new、delete
    • Java: new、自动回收
    自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型的问题:
    忘记回收 多次回收 2、如何定位垃圾 引用计数 根可达算法
    3、常见的垃圾回收算法 标记清除:位置不连续,产生内存碎片
    复制算法:没有内存碎片,浪费空间 标记压缩:没有内存碎片,效率偏低
  • 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 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