| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>遇见pod重启.md</title>
- <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
-
- <style>
- /* https://github.com/microsoft/vscode/blob/master/extensions/markdown-language-features/media/markdown.css */
- /*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
- body {
- font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif);
- font-size: var(--vscode-markdown-font-size, 14px);
- padding: 0 26px;
- line-height: var(--vscode-markdown-line-height, 22px);
- word-wrap: break-word;
- }
- html,footer,header{
- font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif);
- font-size: var(--vscode-markdown-font-size, 14px);
- }
- #code-csp-warning {
- position: fixed;
- top: 0;
- right: 0;
- color: white;
- margin: 16px;
- text-align: center;
- font-size: 12px;
- font-family: sans-serif;
- background-color:#444444;
- cursor: pointer;
- padding: 6px;
- box-shadow: 1px 1px 1px rgba(0,0,0,.25);
- }
- #code-csp-warning:hover {
- text-decoration: none;
- background-color:#007acc;
- box-shadow: 2px 2px 2px rgba(0,0,0,.25);
- }
- body.scrollBeyondLastLine {
- margin-bottom: calc(100vh - 22px);
- }
- body.showEditorSelection .code-line {
- position: relative;
- }
- body.showEditorSelection .code-active-line:before,
- body.showEditorSelection .code-line:hover:before {
- content: "";
- display: block;
- position: absolute;
- top: 0;
- left: -12px;
- height: 100%;
- }
- body.showEditorSelection li.code-active-line:before,
- body.showEditorSelection li.code-line:hover:before {
- left: -30px;
- }
- .vscode-light.showEditorSelection .code-active-line:before {
- border-left: 3px solid rgba(0, 0, 0, 0.15);
- }
- .vscode-light.showEditorSelection .code-line:hover:before {
- border-left: 3px solid rgba(0, 0, 0, 0.40);
- }
- .vscode-light.showEditorSelection .code-line .code-line:hover:before {
- border-left: none;
- }
- .vscode-dark.showEditorSelection .code-active-line:before {
- border-left: 3px solid rgba(255, 255, 255, 0.4);
- }
- .vscode-dark.showEditorSelection .code-line:hover:before {
- border-left: 3px solid rgba(255, 255, 255, 0.60);
- }
- .vscode-dark.showEditorSelection .code-line .code-line:hover:before {
- border-left: none;
- }
- .vscode-high-contrast.showEditorSelection .code-active-line:before {
- border-left: 3px solid rgba(255, 160, 0, 0.7);
- }
- .vscode-high-contrast.showEditorSelection .code-line:hover:before {
- border-left: 3px solid rgba(255, 160, 0, 1);
- }
- .vscode-high-contrast.showEditorSelection .code-line .code-line:hover:before {
- border-left: none;
- }
- img {
- max-width: 100%;
- max-height: 100%;
- }
- a {
- text-decoration: none;
- }
- a:hover {
- text-decoration: underline;
- }
- a:focus,
- input:focus,
- select:focus,
- textarea:focus {
- outline: 1px solid -webkit-focus-ring-color;
- outline-offset: -1px;
- }
- hr {
- border: 0;
- height: 2px;
- border-bottom: 2px solid;
- }
- h1 {
- padding-bottom: 0.3em;
- line-height: 1.2;
- border-bottom-width: 1px;
- border-bottom-style: solid;
- }
- h1, h2, h3 {
- font-weight: normal;
- }
- table {
- border-collapse: collapse;
- }
- table > thead > tr > th {
- text-align: left;
- border-bottom: 1px solid;
- }
- table > thead > tr > th,
- table > thead > tr > td,
- table > tbody > tr > th,
- table > tbody > tr > td {
- padding: 5px 10px;
- }
- table > tbody > tr + tr > td {
- border-top: 1px solid;
- }
- blockquote {
- margin: 0 7px 0 5px;
- padding: 0 16px 0 10px;
- border-left-width: 5px;
- border-left-style: solid;
- }
- code {
- font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
- font-size: 1em;
- line-height: 1.357em;
- }
- body.wordWrap pre {
- white-space: pre-wrap;
- }
- pre:not(.hljs),
- pre.hljs code > div {
- padding: 16px;
- border-radius: 3px;
- overflow: auto;
- }
- pre code {
- color: var(--vscode-editor-foreground);
- tab-size: 4;
- }
- /** Theming */
- .vscode-light pre {
- background-color: rgba(220, 220, 220, 0.4);
- }
- .vscode-dark pre {
- background-color: rgba(10, 10, 10, 0.4);
- }
- .vscode-high-contrast pre {
- background-color: rgb(0, 0, 0);
- }
- .vscode-high-contrast h1 {
- border-color: rgb(0, 0, 0);
- }
- .vscode-light table > thead > tr > th {
- border-color: rgba(0, 0, 0, 0.69);
- }
- .vscode-dark table > thead > tr > th {
- border-color: rgba(255, 255, 255, 0.69);
- }
- .vscode-light h1,
- .vscode-light hr,
- .vscode-light table > tbody > tr + tr > td {
- border-color: rgba(0, 0, 0, 0.18);
- }
- .vscode-dark h1,
- .vscode-dark hr,
- .vscode-dark table > tbody > tr + tr > td {
- border-color: rgba(255, 255, 255, 0.18);
- }
- </style>
- <style>
- /* Tomorrow Theme */
- /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
- /* Original theme - https://github.com/chriskempson/tomorrow-theme */
- /* Tomorrow Comment */
- .hljs-comment,
- .hljs-quote {
- color: #8e908c;
- }
- /* Tomorrow Red */
- .hljs-variable,
- .hljs-template-variable,
- .hljs-tag,
- .hljs-name,
- .hljs-selector-id,
- .hljs-selector-class,
- .hljs-regexp,
- .hljs-deletion {
- color: #c82829;
- }
- /* Tomorrow Orange */
- .hljs-number,
- .hljs-built_in,
- .hljs-builtin-name,
- .hljs-literal,
- .hljs-type,
- .hljs-params,
- .hljs-meta,
- .hljs-link {
- color: #f5871f;
- }
- /* Tomorrow Yellow */
- .hljs-attribute {
- color: #eab700;
- }
- /* Tomorrow Green */
- .hljs-string,
- .hljs-symbol,
- .hljs-bullet,
- .hljs-addition {
- color: #718c00;
- }
- /* Tomorrow Blue */
- .hljs-title,
- .hljs-section {
- color: #4271ae;
- }
- /* Tomorrow Purple */
- .hljs-keyword,
- .hljs-selector-tag {
- color: #8959a8;
- }
- .hljs {
- display: block;
- overflow-x: auto;
- color: #4d4d4c;
- padding: 0.5em;
- }
- .hljs-emphasis {
- font-style: italic;
- }
- .hljs-strong {
- font-weight: bold;
- }
- </style>
- <style>
- /*
- * Custom MD PDF CSS
- */
- html,footer,header{
- font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo";
- }
- body {
- font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif, "Meiryo";
- padding: 0 12px;
- }
- pre {
- background-color: #f8f8f8;
- border: 1px solid #cccccc;
- border-radius: 3px;
- overflow-x: auto;
- white-space: pre-wrap;
- overflow-wrap: break-word;
- }
- pre:not(.hljs) {
- padding: 23px;
- line-height: 19px;
- }
- blockquote {
- background: rgba(127, 127, 127, 0.1);
- border-color: rgba(0, 122, 204, 0.5);
- }
- .emoji {
- height: 1.4em;
- }
- code {
- font-size: 14px;
- line-height: 19px;
- }
- /* for inline code */
- :not(pre):not(.hljs) > code {
- color: #C9AE75; /* Change the old color so it seems less like an error */
- font-size: inherit;
- }
- /* Page Break : use <div class="page"/> to insert page break
- -------------------------------------------------------- */
- .page {
- page-break-after: always;
- }
- </style>
- <link rel="stylesheet" href="file:///Users/gamehu/Documents/new-blog/R%3A%5C2.Travail%5C1.Enseignement%5CCours%5C_1.Outils%5C2.Developpement%5C1.SCSS%5Cmain.css" type="text/css"><link rel="stylesheet" href="file:///Users/gamehu/Documents/new-blog/D%3A%5Crdaros%5CCours%5C_1.Outils%5C2.Developpement%5C1.SCSS%5Cmain.css" type="text/css">
- </head>
- <body>
- <h2 id="title-%E9%81%87%E8%A7%81pod%E9%87%8D%E5%90%AFauthor-gamehudate-2024-02-18-093129tags">title: 遇见pod重启<br>
- author: Gamehu<br>
- date: 2024-02-18 09:31:29<br>
- tags:</h2>
- <div class="tag-container">
- <span class="main-tag">遇见系列</span>
- <span class="sub-tag">第五篇</span>
- </div>
- <div class="article-quote"></div>
- <p>现场的应用A pod一段时间就会重启,用k8s命令看pod是因为超出limits。</p>
- <p>查看了gc日志。因为使用的是G1回收器</p>
- <p>让我详细解释G1 GC的工作流程:</p>
- <p>内存分区:</p>
- <p>整个堆内存被划分为大小相等的Region(默认2048个)<br>
- Region大小是2的幂次方,范围从1MB到32MB<br>
- 每个Region可以是Eden、Survivor、Old或Humongous区<br>
- Humongous区专门用于存储大于Region大小一半的对象</p>
- <p>GC周期的四个主要阶段:</p>
- <p>a) 初始标记(Initial Mark)- STW:</p>
- <p>标记所有直接从GC Roots可达的对象<br>
- 这个阶段需要Stop-The-World(STW)<br>
- 通常和年轻代收集同时进行<br>
- 时间很短</p>
- <p>b) 并发标记(Concurrent Mark):</p>
- <p>遍历整个堆的对象图<br>
- 标记所有可达的对象<br>
- 与应用程序并发执行<br>
- 使用SATB(Snapshot-At-The-Beginning)算法<br>
- 记录标记期间的引用变化</p>
- <p>c) 最终标记(Final Mark)- STW:</p>
- <p>处理并发标记阶段遗留的SATB缓冲区<br>
- 完成最终的标记工作<br>
- 需要STW,但时间较短</p>
- <p>d) 筛选回收(Live Data Counting and Evacuation)- STW:</p>
- <p>计算各个Region的垃圾比例<br>
- 根据用户期望的停顿时间建立回收集合<br>
- 优先回收价值最大的Region(垃圾最多)<br>
- 将存活对象复制到新的Region<br>
- 清空旧Region</p>
- <p>特殊处理:</p>
- <p>a) 年轻代收集:</p>
- <p>当Eden区满时触发<br>
- 只关注年轻代Region<br>
- 存活对象复制到Survivor区或老年代</p>
- <p>b) 混合收集:</p>
- <p>同时回收年轻代和部分老年代Region<br>
- 根据全局并发标记的结果<br>
- 老年代Region按垃圾收集价值排序</p>
- <p>优化机制:</p>
- <p>a) Remembered Sets(Rsets):</p>
- <p>记录跨Region的引用关系<br>
- 每个Region都有一个RSet<br>
- 避免全堆扫描</p>
- <p>b) Collection Sets(CSets):</p>
- <p>需要被回收的Region集合<br>
- 基于垃圾占比和期望停顿时间选择</p>
- <p>正常GC流程:</p>
- <p>Young GC:回收年轻代Region<br>
- 并发标记周期:标记整个堆的存活对象<br>
- 混合回收:回收年轻代和部分老年代Region</p>
- <p>Full GC触发条件:</p>
- <p>并发标记完成之前就出现内存分配失败<br>
- 回收后的空间仍不足以支持下一次Young GC(空间担保失败)<br>
- 混合回收后仍无法满足内存需求<br>
- Humongous对象分配失败</p>
- <p>Full GC的特点:</p>
- <p>必须Stop-The-World(STW)<br>
- 对整个堆进行压缩和整理<br>
- 单线程执行,停顿时间长<br>
- 会明显影响应用程序性能</p>
- <p>Full GC后的处理:</p>
- <p>如果Full GC后内存足够,应用继续运行<br>
- 如果Full GC后内存仍然不足,抛出OutOfMemoryError</p>
- <p>避免Full GC的建议:</p>
- <p>合理设置堆内存大小<br>
- 调整并发标记的触发阈值<br>
- 适当调整Region大小<br>
- 控制大对象的产生<br>
- 及时进行并发标记,避免内存耗尽</p>
- <p>Full GC在G1中的具体执行步骤:</p>
- <ol>
- <li>标记阶段(Marking Phase):</li>
- </ol>
- <ul>
- <li>进入STW阶段,停止所有用户线程</li>
- <li>从GC Roots开始进行全堆标记</li>
- <li>标记所有存活对象</li>
- <li>使用单线程进行标记,效率较低</li>
- </ul>
- <ol start="2">
- <li>清理阶段(Cleanup Phase):</li>
- </ol>
- <ul>
- <li>清理所有未被标记的对象(垃圾对象)</li>
- <li>回收空的Region</li>
- <li>重置各种元数据信息(RSet等)</li>
- <li>计算所有Region的存活对象信息</li>
- </ul>
- <ol start="3">
- <li>压缩阶段(Compaction Phase):</li>
- </ol>
- <ul>
- <li>对存活对象进行压缩整理</li>
- <li>将存活对象复制到新的Region</li>
- <li>按照新的分代布局重新整理对象</li>
- <li>更新对象引用关系</li>
- <li>释放旧的Region</li>
- <li>重建RSet等辅助数据结构</li>
- </ul>
- <p>特点:</p>
- <ul>
- <li>整个过程完全STW</li>
- <li>单线程执行,性能较差</li>
- <li>会对整个堆内存进行处理</li>
- <li>会导致较长时间的停顿</li>
- <li>会破坏原有的分代结构,需要重新构建</li>
- </ul>
- <p>触发Full GC通常意味着:</p>
- <ul>
- <li>内存分配压力过大</li>
- <li>并发收集来不及回收内存</li>
- <li>可能需要调整GC参数或应用程序代码</li>
- </ul>
- </body>
- </html>
|