浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网

频道:欧洲联赛 日期: 浏览:171

专心于Java范畴优质技能,欢迎重视

作者:作者:零壹技能栈

前语

本文介绍 GC 根底原理和理论,GC 调优办法思路和办法,依据 Hotspot jdk1.8,学习之后你将了解怎么对出产体系呈现的 GC 问题进行浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网排查处理。

正文

本文的内容首要如下:

  • GC 根底原理,触及调优方针,GC 事情分类、JVM 内存分配战略、GC 日志剖析等
  • CMS 原理及调优。
  • G1 原理及调优
  • GC 问题排查和处理思路

1. GC 根底原理

1.1. GC 调优方针

大多数情况下对 Java 程序进行 GC 调优,首要重视两个方针眼镜蛇11焚烧轿车:

  • 呼应速度(Responsiveness):呼应速度指程序或体系对一个恳求的呼应有多敏捷

比方,用户订单查询呼应时刻,对呼应速度要求很高的体系,较大的中止时刻是不行承受的。调优的要点是在短的时刻内快速呼应。

  • 吞吐量(Throughput):吞吐量重视在一个特守时刻段内运用体系的最大作业量

例如每小时批处理体系能完结的使命数量,在吞吐量方面优化的体系,较长的 GC 中止时刻也是能够承受的,由于高吞吐量运用更关怀的是怎么尽或许快地完结整个使命,不考虑快速呼运用户恳求

在 GC 调优中,GC 导致的运用暂停时刻影响体系呼应速度,GC 处理线程的 CPU 运用率影响体系吞吐量。

1.2. GC 分代搜集算法

现代的废物搜集器根本都是选用分代搜集算法,其首要思维: 浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网将 Java 的堆内存逻辑上分红两块:新生代、老时代,针对不同存活周期、不同巨细的方针采纳不同的废物收回战略。

1.2.1. 新生代(Young Generation)

新生代又名年青代,大多数方针在新生代中被创立,许多方针的生命周期很短。每次新生代的废物收回(又称 Young GC、Minor GC、YGC)后只要少数方针存活,所以运用仿制算法,只需少数的仿制操作本钱就能够完结收回。

**新生代内又分三个区:**一个 Eden 区,两个 Survivor 区(S0、S1,又称From Survivor、To Survivor),大部分方针在 Eden 区中生成。

当 Eden 区满时,还存活的方针将被仿制到两个 Survivor 区(中的一个);当这个 Survivor 区满时,此区的存活且不满意提升到老时代条件的方针将被仿制到别的一个 Survivor 区。方针每阅历一次仿制,年纪加 1,到达提升年纪阈值后,搬运到老时代。

1.2.2. 老时代(Old Generation)

在新生代中阅历了 N 次废物收回后依然存活的方针,就会被放到老时代,该区域中方针存活率高。老时代的废物收回一般运用“符号-收拾”算法。

1.3. GC 事情分类

依据废物搜集收回的区域不同,废物搜集首要分为:

  • Young GC
  • Old GC
  • Full GC
  • Mixed GC

1.3.1. Young GC

新生代内存的废物搜集事情称为 Young GC(又称 Minor GC),当 JVM 无法为新方针分配在新生代内存空间时总会触发 Young GC。比方 Eden 区占满时,新方针分配频率越高,Young GC 的频率就越高。

Young GC 每次都会引起全线中止(Stop-The-World),暂停一切的运用线程,中止时刻相对老时代 GC 形成的中止,简直能够忽略不计。

1.3.2. Old GC/Full GC/Mixed GC

Old GC:只收拾老时代空间的 GC 事情,只要 CMS 的并发搜集是这个形式。

Full GC:收拾整个堆的 GC 事情,包含新生代、老时代、元空间等 。

Mixed GC:收拾整个新生代以及部分老时代的 GC,只要 G1 有这个形式。

1.4. GC 日志剖析

GC 日志是一个很重要的东西,它精确记载了每一次的 GC 的履行时刻和履行成果,经过剖析 GC 日志能够调优堆设置和 GC 设置,或许改善运用程序的方针分配形式。

敞开的 JVM 发动参数如下:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps

常见的 Young GC、Full GC 日志意义如下:

  • Young GC

  • Full GC

免费的 GC 日志图形剖析东西引荐下面 2 个:

  • GCViewer:下载 jar 包直接运转
  • gceasy:Web 东西,上传 GC 日志在线运用

1.5. 内存分配战略

Java 供给的主动内存办理,能够归结为处理了方针的内存分配和收回的问题。前面现已介绍了内存收回,下面介绍几条最遍及的内存分配战略:

1.5.1. 方针优先在 班纳布斯Eden 区别配

大多数情况下,方针在先新生代南山兵哥 Eden 区中分配。当 Eden 区没有满意空间进行分配时,虚拟机将建议一次 Young GC。

1.5.2. 大方针直接进入老时代

JVM 供给了一个方针巨细阈值参数(-XX:PretenureSizeThreshold,默许值为 0,代表不论多大都是先在 Eden 中分配内存)。

大于参数设置的阈值值的方针直接在老时代分配,这样能够防止方针在 Eden 及两个 Survivor 直接发作大内存仿制。

1.5.3. 长林逐水期存活的方针进入老时代

方针每阅历一次废物收回,且没被收回掉,它的年纪就添加 1,大于年纪阈值参数(-XX:MaxTenuringThreshold,默许 15)的方针,将提升到老时代中。

1.5.4. 空间分配担保

当进行 Young GC 之前,JVM 需求预估:老时代是否能够包容 Youn血型通脉纳米磁能裤g GC 后新生代提升到老时代的存活方针,以确认是否需求提早触发 GC 收回老时代空间,依据空间分配担保战略来核算。

Young GC 之后假如成功(Young GC 后提升方针能放入老时代),则代表担保成功,不用再进行 Full GC,进步功能。

假如失利,拉瓦锡砍头试验则会呈现“promotion failed”过错,代表担保失利,需求进行 Full GC。

1.5.5. 动态年纪断定

新生代方针的年纪或许没到达阈值(MaxTenuringThreshold 参数指定)就提升老时代。

假如 Young GC 之后,新生代存活方针到达相同年纪一切方针巨细的总和大于恣意 Survivor 空间(S0+S1空间)的一半,此刻 S0 或许 S1 区行将包容不了存活的新生代方针。

年纪大于或等于该年纪的方针就能够直接进入老时代,无须比及 MaxTenuringThreshold 中要求的年纪。

别的,假如 Young GC 后 S0 或 S1 区缺乏以包容:未到达提升老时代条件的新生代存活方针,会导致这些存活方针直接进入老时代,需求尽量防止。

2. CMS 原理及调优

2.1. 术语解说

2.1.1. 可达性剖析算法

用于判别方针是否存活,根本思维是经过一系列称为“GC Root”的方针作为起点(常见的 GC koreangayRoot 有体系类加载器、栈中的方针、处于激活状况的线程等),依据方针引证联系,从 GC Roots 开端向下查找,所走过的途径称为引证链,当一个方针到 GC Root 没有任何引证链相连,证明方针不再存活。

2.1.2. Stop The World

GC 进程中剖析方针引证联系,为了确保剖析成果的精确性,需求经过中止一切 Java 履行线程,确保引证联系不再动态改动,该中止事情称为 Stop The World(STW)。

2.1.3. Safepoint

代码履行进程中的一些特别方位,当线程履行到这些方位的时分,阐明虚拟机当时的状况是安全的,假如有需求 GC,线程能够在这个方位暂停。

HotSpot 选用主动中止的办法,让履行线程在运转期轮询是否需求暂停的标志,若需求则中止挂起。

2.2. CMS 算法简介

CMS(Concurrent Mark and Sweep 并发-标浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网记-铲除),是一款依据并发、运用符号铲除算法的废物收回算法,只针对老时代进行废物收回。

CMS 搜集器作业时,尽或许让 GC 线程和用户线程并发履行,以到达下降 STW 时刻的意图。

经过以下指令行参数,启用 CMS 废物搜集器:

-XX:+UseConcMarkSweepGC

值得弥补的是,下面介绍到的 CMS GC 是指老时代的 GC,而 Full GC 指的是整个堆的 GC 事情,包含新生代、老时代、元空间等,两者有所区别。

2.3. 新生代废物收回

能与 CMS 调配运用的新生代废物搜集器有 Serial 搜集器和 ParNew 搜集器。

这 2 个搜集器都选用符号仿制算法,都会触发 STW 事情,中止一切的运用线程。不同之处在于,Serial 是单线程履行,ParNew 是多线程履行。

2.4. 老时代废物收回

CMS GC 以获取最小中止时刻为意图,尽或许削减 STW 浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网时刻,能够分为 7 个阶段:

2.4.1. 初始符号(Initial Mark)

初始符号阶段的方针是符号老时代中一切存活的方针, 包含 GC Root 的直接引证, 以及由新生代中存活方针所引证的方针,触发第一次 STW 事情。

这个进程是支撑多线程的(JDK7 之前单线程,JDK8 之后并行,可经过参数 CMSParallelInitialMarkEnabled 调整)。

2.4.2. 并发符号(Concurrent Mark)

并发符号阶段 GC 线程和运用线程并发履行,遍历阶段 1 初始符号出来的存活方针,然后持续递归符号这些方针可达的方针。

2.4.3. 并发预收拾(Concurrent Preclean)

并发预收拾阶段 GC 线程和运用线程也是并发履行,由于阶段 2 是与运用线程并发履行,或许有些引证联系现已发作改动。

经过卡片符号(Card Marking),提早把老时代空间逻辑区分为持平巨细的区域(Card)。

假如引证联系发作改动,JVM 会将发作改动的区域符号为 “脏区”(Dirty Card),然后在本阶段,这些脏区会被找出来,改写引证联系,铲除“脏区”符号。

2.4.4. 并发可磁力云撤销的预收拾(Concurrent Abortable Preclean)

并发可撤销的预收拾阶段也不中止运用线程。本阶段测验在 STW 的终究符号阶段(Final Remark)之前尽或许地多做一些作业,以削减运用暂停时刻。

在该阶段不断循环处理:符号老时代的可达方针、扫描处理 Dirty Card 区域中的方针,循环的中止条件有:

  • 到达循环次数
  • 到达循环履行时刻阈值
  • 新生代内存运用率到达阈值

2.4.5. 终究符号(Final Remark)

这是 GC 事情中第2次(也是终究一次)STW 阶段,方针是完结老时代中一切存活方针的符号,此阶段会履行:

  • 遍历新生代方针,从头符号
  • 依据 GC Roots,从头符号
  • 遍历老时代的 Dirty Card,从头符号

2.4.6. 并发铲除(Concurrent Sweep)

并发铲除阶段与运用程序并发履行,不需求 STW 中止,根加宽梳棉机据符号成果铲除废物方针。

2.4.7. 并发重置(Concurrent Reset)

并发重置阶段与运用程序并发履行,重置 CMS 算法相关的内部数据, 为下一次 GC 循环做准备。

2.5. CMS 常见问题

2.5.1. 终究符号阶段中止时刻过长

CMS 的 GC 中止时刻约 80% 都在终究符号阶段(Final Remark),若该阶段中止时刻过长,常见原因是新生代对老时代的无效引证,在上一阶段的并发可撤销预收拾阶段中,履行阈值时刻内未完结循环,来不及触发 Young GC,收拾这些无效引证。

经过添加参数:-XX:+CMSScavengeBeforeRemark。

在履行终究操作之前先触发 Young GC,然后削减新生代对老时代的无效引证,下降终究符号阶段的中止。

但假如在上个阶段(并发可撤销的预收拾)已触发 Young GC,也会重复触发 Young GC。

2.5.2. 并发形式失利 & 提升失利

并发形式失利:当 CMS 在履行收回时,新生代发作废物收回,一起老时代又没有满意的空间包容提升的方针时,CMS 废物收回就会退化成单线程的 Full GC。一切的运用线程都会被暂停,老时代中一切的无效方针都被收回。

提升失利:当新生代发作废物收回,老时代有满意的空间能够包容提升的方针,可是由于闲暇空间的碎片化,导致提升失利,此刻会触发单线pelagea程且带紧缩动作的 Full GC。

并发形式失利和提升失利都会导致长时刻的中止,常见处理思路如下:

  • 下降触发 CMS GC 的阈值
  • 即参数 -XX:CMSInitiatingOccupancyFraction 的值,让 CMS GC 尽早履行,以确保有满意的空间
  • 添加 CMS 线程数,即参数 -XX:ConcGCThreads
  • 增大老时代空间
  • 让方针尽量在新生代收回,防止进入老时代

2.5.3. 内存碎片问题

一般 CMS 的 GC 进程依据符号铲除算法,不带紧缩动作,导致越来越多的内存碎片需求紧缩。

常见以下场景会触发内存碎片紧缩:

  • 新生代 Young GC 呈现新生代提升担保失利(promotion failed))
  • 程序主动履行System.gc()

可经过参数 CMSFullGCsBeforeCompaction 的值,设置多少次 Full GC 触发一次紧缩。

默许值为 0,代表每次进入 Full GC 都会触发紧缩,带紧缩动作的算法为上面说到的单线程 Serial Old 算法,暂停时刻(STW)时刻十分长,需求尽或许削减紧缩时刻。

3. G1 原理及调优

3.1. G1 简介

G1(Garbage-First)是一款面向服务器的废物搜集器,支撑新生代和老时代空间的废物搜集,首要针对装备多核95105856处理器及大容量内存的机器。

G1 最首要的规划方针是:完结可预期及可装备的 STW 中止时刻。

3.2. G1 堆空间区分

3.2.1. Region

为完结大内存空间的低中止时刻的收回,将区分为浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网多个巨细持平的 Region。每个小堆区都或许是 Eden 区,Survivor 区或许 Old 区,可是在同一时刻只能归于某个代。

在逻辑上, 一切的 Eden 区和 Survivor 区合起来便是新生代,一切的 Old 区合起来便是老时代,且新生代和老时代各自的内存 Region 区域由 G1 主动操控,不断变化。

3.2.2. 巨型方针

当方针巨细超越 Region 的一半,则认为是巨型方针(Humongous Object),直接被分配到老时代的巨型方针区(Humongous Regions)。

这些巨型区域是一个接连的区域集,每一个 Region 中最多有一个巨型方针,巨型方针能够占多个 Region。

G1 把堆内存区分红一个个 Region 的意义在于:

  • 每次 GC 不用都去处理整个堆空间,而是每次只处理一部分 Region,完结大容量内存的 GC。
  • 经过核算每个 Region 的收回价值,包含收回所需时刻、可收回空间,在有限时刻内尽或许收回更多的废物方针,把废物收回形成的中止时刻操控在预期装备的时刻范围内,这也是 G1 称号千隆问屈术的由来:Garbage-First。

3.3. G1 作业形式

针对新生代和老时代,G1 供给 2 种 GC 形式,Young GC 和 Mixed GC,两种会导致 Stop The World。

3.3.1. Young GC

当新生代的空间缺乏时,G1 触发 Young GC 收回新生代空间。

Young GC 首要是对 Eden 区进行 GC,它在 Eden 空间耗尽时触发,依据分代收回思维和仿制算法,每次 Yo漏奶ung GC 都会选定一切新生代的 Region。

一起核算下次 Young GC 所需的 Eden 区和 Survivor 区的空间,动态调整新生代所占 Region 个数来操控 Young GC 开支。

3.3.2. Mixed GC

当老时代空间到达阈值会触发 Mixed GC,选定一切新生代里的 Region,依据大局并发符号阶段(下面介绍到)核算得出搜集收益高的若干老时代 Region。

在用户指定的开普法栏目剧双面人魔销方针范围内,尽或许挑选收益高的老时代 Region 进行 GC,经过挑选哪些老时代 Region 和挑选多少 Region 来操控 Mixed GC 开支。

3.4. 大局并发符号

大局并发符号首要是为 Mixed GC 核算找出收收回益较高的 Region 区域,详细分为 5 个阶段:

3.4.1. 初始符号(Initial Mark)

暂停一切运用线程(STW),并发地进行符号从 GC Root 开端直接可达的方针(原生栈方针、大局方针、JNI 方针)。

当到达触发条件时,G1 并不会当即建议并发符号周期,而是等候下一次新生代搜集,运用新生代搜集的 STW 时刻段,完结初始符号,这种办法称为借道(Piggybacking)。

3.4.2. 根区域扫描(Root Region Scan)

在初始符号暂停完毕后,新生代搜集也完结的方针仿制到 Survivor 的作业,运用线程开端活泼起来。

此刻为了确保符号算法的正确性,一切新仿制到 Survivor 分区的方针,需求找出哪些方针存在对老时代方针的引证,把这些方针符号成根(Root)。

这个进程称为根分区扫描(Root Region Scanning),一起扫描的 Suvivor 分区也被称为根分区(Root Region)。

根分区扫描有必要鄙人一次新生代废物搜集发动前完结(接下来并发符号的进程中,或许会被若干次新生代废物搜集打断),由于每次 GC 会发作新的存活方针调集。

3.4.3. 并发符号(Concurrent Marking)

符号线程与运用程序线程并行履行,符号各个堆中 Region 的存活方针信息,这个进程或许被新的 Young GC 打断。

一切的符号使命有必要在堆满前就完结扫描,假如并发符号耗时很长,那么有或许在并发符号进程中,又阅历了几回新生代搜集。

3.4.4. 再次符号(Remark)

和 CMS 相似暂停一切运用线程(STW),以完结符号进程时刻短地中止运用线程, 符号在并发符号阶段发作改动的方针,和一切未被符号的存活方针,一起完结存活数据核算。

3.4.5. 收拾(Cleanup)

为行将到来的搬运阶段做准备, 此阶段也为下一次符号履行一切必需的收拾核算作业:

  • 收拾更新每个 Region 各自的 RSet(Remember Set,HashMap 结构,记载有哪些老时代方针指向本 Region,key 为指向本 Region 的方针的引证,value 为指向本 Region 的详细 Card 区域,经过 RSet 能够确认 Region 中方针存活信息,防止全堆扫描)
  • 收回不包含存活方针的 Region
  • 核算核算收收回益高(依据开释空间和暂停方针)的老时代分区调集

3.5. G1调优留意点

3.5.1. Full GC 问题

G1 的正常处理流程中没有 Full GC,只要在废物收回处理不过来(或许主动触发)时才会呈现,G1 的 Full GC 便是单线程履行的 Serial old gc,会导致十分长的 STW,是调优的要点,需求尽量防止 Full GC。

常见原因如下:

  • 程序主动履行 System.g帅哥男同志c()
  • 大局并发符号期间老时代空间被填满(并发形式失利)
  • Mixed GC 期间老时代空间被填满(提升失利)
  • Young GC 时 Survivor 空间和老时代没有满意空间包容存活方针

相似 浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网CMS,常见的处理是:

  • 增大 -XX:ConcGCThreads=n 选项添加并发符号线程的数量,或许 STW 期间并行线程的数量:-XX:ParallelGCThreads=n。
  • 减小 -XX:InitiatingHeapOccupancyPercent 提早发动符号周期。
  • 增大预留内存 -XX:G1ReservePercent=n,默许值是 10,代表运用 10% 的堆内存为预留内存,当 Survivor 区域没有满意空间包容新提升方针时会测验运用预留内存。

3.5.2. 巨型方针分配

巨型方针区中的每个 Region 中包含一个巨型方针,剩下空间不再运用,导致空间碎片化,当 G1 没有适宜空间分配巨型方针时,G1 会发动串行 Full贝亚国王 GC 来开释空间。

能够经过添加 -XX:G1HeapRegionSize 来增大 Region 巨细,这样一来,适当一部分的巨型方针就不再是巨型方针了,而是选用一般的分配办法。

3.5.3. 不要设置 Young 区的巨细

原因是为了尽量满意方针中止时刻,逻辑上的 Young 区会进行动态调整。假如设置了巨细,则会覆盖掉并且会禁用掉对中止时刻的操控。

3.5.4. 均匀呼应时刻设置

运用运用的均匀呼应时刻作为参阅来设置 MaxGCPauseMillis,JVM 会尽量去满意该条件,或许是 90% 的恳求或许更多的呼应时刻在这之内, 可是并不代表是一切的恳求都能满意,均匀呼应时刻设置过小会导致频频 GC。

4. 调优办法与思路

如白岩沟剿匪何剖析体系 JV广元堂纤体梅M GC 运转状况及合理优化?

GC 优化的中心思路在于,尽或许让方针在新生代中分配和收回,尽量防止过多方针进入老时代,导致对老时代频频进行废物收回,一起给体系满意的内存削减新生代废物收回次数,进行体系剖析和优化也是围绕着这个思路翻开。

4.1. 剖析体系的运转状况

剖析体系的运转状况:

  • 体系每秒恳求数、每个恳求创立多少方针,占用多少内存。
  • Young GC 触发频率、方针进入老时代的速率。
  • 老时代占用内存、F阿福宝盒ull GC 触发频率、Full GC 触发的原因、长时刻 Full GC 的原因。

常用东西如下:

4.1.1. jstat

jstat 是 JVM 自带指令行东西,可用于核算内存分配速率、GC 次数,GC 耗时。常用指令格局如下:

jstat -gc  <核算间隔时刻> <核算次数>

输出返回值代表意义如下:

例如:jstat -gc 32683 1000 10,核算 pid=32683 的进程,每秒核算 1 次,核算 10 次。

4.1.2. jmap

jmap 也是 JVM 自带指令行东西,可用于了解体系运转时的方针散布。常用指令格局如下:

// 指令行输出类名、类数量数量,类占用内存巨细,
// 依照类占用内存巨细降序摆放
jmap -histo
// 生成堆内存转储快照,在当时目录下导出dump.hrpof的二进制文件,
// 能够用eclipse的MAT图形化东西剖析
jmap -dump:live,format=b,file=dump.hprof

4.1.3. jinfo

用来查看正在运转的 Java 运用程序的扩展参数,包含 Java System 特点和 JVM 指令行参数。指令格局如下:

jinfo  

4.1.4. 其他 GC 东西

  • 监控告警体系:Zabbix、Prometheus、Open-Falcon
  • jdk 主动实时内存监控东西:VisualVM
  • 堆外内存监控:Java VisualVM 装置 Buffer Pools 插件、google perf东西、Java NMT(Native Memory Tracking)东西
  • GC 日志剖析:GCViewer、gceasy
  • GC 参数查看和优化:xxfox.perfma.com/

4.2. GC 优化事例

4.2.1. 数据剖析渠道体系频频 Full GC

渠道首要对用户在 App 中行为进行守时剖析核算,并支撑报表导出,运用 CMS GC 算法。

数据剖析师在运用中发现体系页面翻开常常卡顿,经过 jstat 指令发现体系每次 Young GC 后大约有 10% 的存活方针进入老时代。

本来是由于 Survivor 区空间设置过小,每次 Young GC 后存活方针在 Survivor 区域放不下,提早进入老时代。

经过调大 Survivor 区,使得 Survivor 区能够包容 Young GC 后存活方针,方针在 Survivor 区阅历屡次 Young GC 到达年纪阈值才进入老时代。

调整之后每次 Young GC 后进入老时代的存活方针安稳运转时仅几百 Kb,Full GC 频率大大下降。

4.2.2. 事务浙江工商大学,古墓丽影,秋雅-雷竞技客户端_雷竞技raybet官网对接网关 OOM

网关首要消费 Kafka 数据,进行数据处理核算然后转发到别的的 Kafka 行列,体系运转几个小时分呈现 OOM,重启体系几个小时之后又 OOM。

经过 jmap 导出堆内存,在 eclipse MAT 东西剖析才找出原因:代码中将某个事务 Kafka 的 topic 数据进行日志异步打印,该事务数据量较大,很多方针堆积在内存中等候被打印,导致 OOM。

4.2.3. 鉴权体系频频长时刻 Full GC

体系对外供给各种账号鉴权服务,运用时发现体系常常服务不行用,经过 Zabbix 的监控渠道监控发现体系频频发作长时刻 Full GC,且触发时老时代的堆内存一般并没有占满,发现本来是事务代码中调用了 System.gc()。

小结

GC 问题能够说没有捷径,排查线上的功能问题自身就并不简略,除了将本文介绍到的原理和东西融会贯通,还需求咱们不断去堆集经历,真实做到功能最优。

篇幅所限,不再翻开介绍常见 GC 参数的运用,能够从 GitHub 克隆:

https://github.com/caison/caison-blog-demo

来历:掘金 链接:https://juejin.im/post/5d8c5a5de51d4578323d51bd

热门
最新
推荐
标签