-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
219 lines (206 loc) · 42.7 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=2"><meta name="theme-color" content="#222"><meta name="generator" content="Hexo 4.2.1"><link rel="apple-touch-icon" sizes="180x180" href="https://cdn.jsdelivr.net/gh/0vo/oss/images/favicon.ico?v=7.4.1"><link rel="icon" type="image/png" sizes="32x32" href="https://cdn.jsdelivr.net/gh/0vo/oss/images/favicon.ico?v=7.4.1"><link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/0vo/oss/images/favicon.ico?v=7.4.1"><link rel="mask-icon" href="https://cdn.jsdelivr.net/gh/0vo/oss/images/favicon.ico?v=7.4.1" color="#222"><link rel="alternate" href="/atom.xml" title="Ehlxr's Blog" type="application/atom+xml"><meta name="google-site-verification" content="F10oBMYHtBN4295aHavGAYWSfIxhy1KXoZRBqwg2KyI"><link rel="stylesheet" href="/css/main.css?v=7.4.1"><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic|Damion:300,300italic,400,400italic,700,700italic&display=swap&subset=latin,latin-ext"><link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.7.0"><link rel="stylesheet" href="/lib/pace/pace-theme-loading-bar.min.css?v=1.0.2"><script src="/lib/pace/pace.min.js?v=1.0.2"></script><script id="hexo-configurations">var NexT=window.NexT||{},CONFIG={root:"/",scheme:"Mist",version:"7.4.1",exturl:!1,sidebar:{position:"right",display:"hide",offset:12,onmobile:!0},copycode:{enable:!0,show_result:!0,style:null},back2top:{enable:!0,sidebar:!1,scrollpercent:!0},bookmark:{enable:!1,color:"#222",save:"auto"},fancybox:!1,mediumzoom:!0,lazyload:!1,pangu:!1,algolia:{appID:"",apiKey:"",indexName:"",hits:{per_page:10},labels:{input_placeholder:"Search for Posts",hits_empty:"We didn't find any results for the search: ${query}",hits_stats:"${hits} results found in ${time} ms"}},localsearch:{enable:!0,trigger:"auto",top_n_per_article:1,unescape:!0,preload:!1},path:"search.xml",motion:{enable:!0,async:!0,transition:{post_block:"fadeIn",post_header:"slideDownIn",post_body:"slideDownIn",coll_header:"slideLeftIn",sidebar:"slideUpIn"}},translation:{copy_button:"复制",copy_success:"复制成功",copy_failure:"复制失败"},sidebarPadding:40}</script><meta name="description" content="瞻前顾后,惶惶不可终日"><meta property="og:type" content="website"><meta property="og:title" content="Ehlxr's Blog"><meta property="og:url" content="https://ehlxr.me/index.html"><meta property="og:site_name" content="Ehlxr's Blog"><meta property="og:description" content="瞻前顾后,惶惶不可终日"><meta property="og:locale" content="zh_CN"><meta property="article:author" content="!!@_@ ᵛᵉ"><meta name="twitter:card" content="summary"><link rel="canonical" href="https://ehlxr.me/"><script id="page-configurations">CONFIG.page={sidebar:"",isHome:!0,isPost:!1,isPage:!1,isArchive:!1}</script><link rel="stylesheet" href="//cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.css"><style>#needsharebutton-postbottom{cursor:pointer;height:26px;margin-top:10px;position:relative}#needsharebutton-postbottom .btn{border:1px solid $btn-default-border-color;border-radius:3px;display:initial;padding:1px 4px}</style><style>#needsharebutton-float{bottom:88px;cursor:pointer;left:-8px;position:fixed;z-index:9999}#needsharebutton-float .btn{border:1px solid $btn-default-border-color;border-radius:4px;padding:0 10px 0 14px}</style><script>((w, d) => {
'use strict';
//
// const userScheme = localStorage.getItem('Scheme');
// if (!userScheme) return;
//
//
const userScheme = localStorage.getItem('Scheme');
if(userScheme){
d.documentElement.className = 'darkScheme';
}
localStorage.removeItem('hasClickListener');
})(window, document);</script><title>Ehlxr's Blog - 「闲言碎语」</title><noscript><style>.sidebar-inner,.use-motion .brand,.use-motion .collection-header,.use-motion .comments,.use-motion .menu-item,.use-motion .pagination,.use-motion .post-block,.use-motion .post-body,.use-motion .post-header{opacity:initial}.use-motion .logo,.use-motion .site-subtitle,.use-motion .site-title{opacity:initial;top:initial}.use-motion .logo-line-before i{left:initial}.use-motion .logo-line-after i{right:initial}</style></noscript></head><body itemscope itemtype="http://schema.org/WebPage"><div class="container use-motion"><div class="headband"></div><header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="header-inner"><div class="site-brand-container"><div class="site-meta"><div><a href="/" class="brand" rel="start"><span class="logo-line-before"><i></i></span> <span class="site-title">Ehlxr's Blog</span><span class="logo-line-after"><i></i></span></a></div><h1 class="site-subtitle" itemprop="description">「闲言碎语」</h1></div><div class="site-nav-toggle"><div class="toggle" aria-label="切换导航栏"><span class="toggle-line toggle-line-first"></span><span class="toggle-line toggle-line-middle"></span><span class="toggle-line toggle-line-last"></span></div></div></div><nav class="site-nav"><ul id="menu" class="menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="fa fa-fw fa-home"></i> 首页</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="fa fa-fw fa-archive"></i> 归档</a></li><li class="menu-item menu-item-search"><a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i> 搜索</a></li></ul></nav><div class="site-search"><div class="popup search-popup"><div class="search-header"><span class="search-icon"><i class="fa fa-search"></i></span><div class="search-input-container"><input autocomplete="off" autocorrect="off" autocapitalize="none" placeholder="搜索..." spellcheck="false" type="text" id="search-input"></div><span class="popup-btn-close"><i class="fa fa-times-circle"></i></span></div><div id="search-result"></div></div><div class="search-pop-overlay"></div></div><div class="night-mode motion-element"><span class="delimiter">|</span><a role="button" class="night-btn"><i class="fa fa-adjust"></i></a></div><script>var st,OriginTitile=document.title;document.addEventListener("visibilitychange",function(){document.hidden?(document.title="╭(°A°`)╮好奇怪崩溃啦!",clearTimeout(st)):(document.title="(ฅ>ω<*ฅ) 噫又好了~ "+OriginTitile,st=setTimeout(function(){document.title=OriginTitile},4e3))})</script></div></header><div class="back-to-top"><i class="fa fa-arrow-up"></i> <span>0%</span></div><div class="reading-progress-bar"></div><main id="main" class="main"><div class="main-inner"><div class="content-wrap"><div id="content" class="content"><div class="posts-expand"><article itemscope itemtype="http://schema.org/Article" class="post-block home" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://ehlxr.me/2022/07/10/docker-keepalived-nginx-ha/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="!!@_@ ᵛᵉ"><meta itemprop="description" content="瞻前顾后,惶惶不可终日"><meta itemprop="image" content="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Ehlxr's Blog"></span><header class="post-header"><h2 class="post-title" itemprop="name headline"><a href="/2022/07/10/docker-keepalived-nginx-ha/" class="post-title-link" itemprop="url">Docker 搭建 Keepalived 实现 Nginx 双机热备</a></h2><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2022-07-10 13:12:14" itemprop="dateCreated datePublished" datetime="2022-07-10T13:12:14+00:00">2022-07-10</time></span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/%E6%9E%B6%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">架构</span></a></span></span><span id="/2022/07/10/docker-keepalived-nginx-ha/" class="post-meta-item leancloud_visitors" data-flag-title="Docker 搭建 Keepalived 实现 Nginx 双机热备" title="阅读次数"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span> <span class="post-meta-item-text">阅读次数:</span><span class="leancloud-visitors-count"></span></span><span class="post-meta-item"><a title="show comments" href="/2022/07/10/docker-keepalived-nginx-ha/#show_comments"><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span></a></span><span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span>3.8k</span></span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span>3 分钟</span></span></div></header><div class="post-body" itemprop="articleBody"><p><img src="https://cdn.jsdelivr.net/gh/0vo/oss/images/keepalived-nginx-ha.jpg" alt="keepalived Nginx HA"></p><p>docker 搭建 keepalived 实现 nginx 双机热备</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">❯ docker run --privileged -d --name node1 debian:11 top -b</span><br><span class="line">❯ docker run --privileged -d --name node2 debian:11 top -b</span><br></pre></td></tr></table></figure><p><code>–-privileged</code> 是指以特权模式启动容器,否则 keepalived 无法成功生成虚拟 IP</p><p>分别进入 node1、node2 容器节点(<code>docker exec -it node1 /bin/bash</code> 和 <code>docker exec -it node2 /bin/bash</code> )</p><p>安装以下软件 <code>apt update && apt install curl vim iproute2 inetutils-ping psmisc net-tools systemctl nginx keepalived -y</code></p><div class="post-button"><a class="btn" href="/2022/07/10/docker-keepalived-nginx-ha/#more" rel="contents">阅读全文 »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></article><article itemscope itemtype="http://schema.org/Article" class="post-block home" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://ehlxr.me/2022/03/19/quick-sort/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="!!@_@ ᵛᵉ"><meta itemprop="description" content="瞻前顾后,惶惶不可终日"><meta itemprop="image" content="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Ehlxr's Blog"></span><header class="post-header"><h2 class="post-title" itemprop="name headline"><a href="/2022/03/19/quick-sort/" class="post-title-link" itemprop="url">快速排序理解</a></h2><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2022-03-19 17:20:32" itemprop="dateCreated datePublished" datetime="2022-03-19T17:20:32+00:00">2022-03-19</time></span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/" itemprop="url" rel="index"><span itemprop="name">排序算法</span></a></span></span><span id="/2022/03/19/quick-sort/" class="post-meta-item leancloud_visitors" data-flag-title="快速排序理解" title="阅读次数"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span> <span class="post-meta-item-text">阅读次数:</span><span class="leancloud-visitors-count"></span></span><span class="post-meta-item"><a title="show comments" href="/2022/03/19/quick-sort/#show_comments"><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span></a></span><span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span>1k</span></span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span>1 分钟</span></span></div></header><div class="post-body" itemprop="articleBody"><p>快速排序算法核心思想,取待排序序列中的某个元素作为分区点,大于分区点的元素挪到分区点右边(从小到大排序),小于分区点的元素挪到分区点左边。然后分区点左右两边的子序列循环以上操作,直至子序列长度为 <code>1</code>。</p><p><strong>左右指针法实现思路</strong></p><p>1、首先定义分区点(pivot)<code>p</code>,<code>p</code> 一般为数组 <code>a</code> 的第一个元素或最后一个元素<br>2、然后定义左(<code>l</code>)、右(<code>r</code>)两个指针分别指向数组的第一个元素(<code>a[0]</code>)和最后一个元素 (<code>a[a.length - 1]</code>)<br>3、如果 <code>a[l] > a[p]</code>,<code>l、p</code> 下标元素互换,<code>l</code> 前进 <code>1</code> 位<br>4、如果 <code>a[r] < a[p]</code>,<code>r、p</code> 下标元素互换,<code>r</code> 后退 <code>1</code> 位<br>5、如果 <code>l >= r</code>,排序结束</p><div class="post-button"><a class="btn" href="/2022/03/19/quick-sort/#more" rel="contents">阅读全文 »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></article><article itemscope itemtype="http://schema.org/Article" class="post-block home" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://ehlxr.me/2022/03/19/heap-sort/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="!!@_@ ᵛᵉ"><meta itemprop="description" content="瞻前顾后,惶惶不可终日"><meta itemprop="image" content="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Ehlxr's Blog"></span><header class="post-header"><h2 class="post-title" itemprop="name headline"><a href="/2022/03/19/heap-sort/" class="post-title-link" itemprop="url">堆排序理解</a></h2><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2022-03-19 15:09:01" itemprop="dateCreated datePublished" datetime="2022-03-19T15:09:01+00:00">2022-03-19</time></span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/" itemprop="url" rel="index"><span itemprop="name">排序算法</span></a></span></span><span id="/2022/03/19/heap-sort/" class="post-meta-item leancloud_visitors" data-flag-title="堆排序理解" title="阅读次数"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span> <span class="post-meta-item-text">阅读次数:</span><span class="leancloud-visitors-count"></span></span><span class="post-meta-item"><a title="show comments" href="/2022/03/19/heap-sort/#show_comments"><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span></a></span><span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span>1.1k</span></span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span>1 分钟</span></span></div></header><div class="post-body" itemprop="articleBody"><p>堆排序的关键是构建大(小)顶堆,堆顶元素就是最大(小)的元素,然后堆顶元素和末尾元素交换位置,再次堆化除最后一个元素外的其它元素,循环次过程即可完成排序。</p><p>翻译成代码如下:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sort</span><span class="params">(<span class="keyword">int</span> a)</span> </span>{</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = a.length - <span class="number">1</span>; i > <span class="number">0</span>; i--) {</span><br><span class="line"> buildHeap(a, i);</span><br><span class="line"> <span class="comment">// 堆顶元素和最后一个元素交换,除过最后一个元素外其它元素再次构建大顶堆</span></span><br><span class="line"> swap(a, <span class="number">0</span>, i);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><div class="post-button"><a class="btn" href="/2022/03/19/heap-sort/#more" rel="contents">阅读全文 »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></article><article itemscope itemtype="http://schema.org/Article" class="post-block home" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://ehlxr.me/2022/03/12/the-kmp/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="!!@_@ ᵛᵉ"><meta itemprop="description" content="瞻前顾后,惶惶不可终日"><meta itemprop="image" content="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Ehlxr's Blog"></span><header class="post-header"><h2 class="post-title" itemprop="name headline"><a href="/2022/03/12/the-kmp/" class="post-title-link" itemprop="url">KMP 算法理解</a></h2><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2022-03-12 22:44:00" itemprop="dateCreated datePublished" datetime="2022-03-12T22:44:00+00:00">2022-03-12</time></span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/%E7%AE%97%E6%B3%95/" itemprop="url" rel="index"><span itemprop="name">算法</span></a></span></span><span id="/2022/03/12/the-kmp/" class="post-meta-item leancloud_visitors" data-flag-title="KMP 算法理解" title="阅读次数"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span> <span class="post-meta-item-text">阅读次数:</span><span class="leancloud-visitors-count"></span></span><span class="post-meta-item"><a title="show comments" href="/2022/03/12/the-kmp/#show_comments"><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span></a></span><span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span>4.4k</span></span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span>4 分钟</span></span></div></header><div class="post-body" itemprop="articleBody"><h2 id="字符串前缀-与字符串后缀"><a href="#字符串前缀-与字符串后缀" class="headerlink" title="字符串前缀 与字符串后缀"></a><strong>字符串前缀</strong> 与<strong>字符串后缀</strong></h2><ul><li><p>字符串前缀(<code>Proper prefix</code>) :包含第一个字符,不包含最后一个字符的所有子串<br>例如:<code>abababca</code> 的前缀:<code>a、ab、aba、abab、ababa、ababab、abababc</code></p></li><li><p>字符串后缀(<code>Proper suffix</code>):不包含第一个字符,包含最后一个字符的所有子串<br>例如:<code>abababca</code> 的后缀:<code>a、ca、bca、abca、babca、ababca、bababca</code></p></li></ul><h2 id="字符串部分匹配表"><a href="#字符串部分匹配表" class="headerlink" title="字符串部分匹配表"></a><strong>字符串部分匹配表</strong></h2><p>字符串部分匹配表 (<code>Partial Match Table</code>) 也称为 <code>next</code> 数组,例如:<code>abababca</code> 的部分匹配表为:</p><table><thead><tr><th>char</th><th>a</th><th>b</th><th>a</th><th>b</th><th>a</th><th>b</th><th>c</th><th>a</th></tr></thead><tbody><tr><td>index</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>value</td><td>0</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>0</td><td>1</td></tr></tbody></table><div class="post-button"><a class="btn" href="/2022/03/12/the-kmp/#more" rel="contents">阅读全文 »</a></div></div><footer class="post-footer"><div class="post-eof"></div></footer></article><article itemscope itemtype="http://schema.org/Article" class="post-block home" lang="zh-CN"><link itemprop="mainEntityOfPage" href="https://ehlxr.me/2021/07/27/jvm-tlab/"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="!!@_@ ᵛᵉ"><meta itemprop="description" content="瞻前顾后,惶惶不可终日"><meta itemprop="image" content="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="Ehlxr's Blog"></span><header class="post-header"><h2 class="post-title" itemprop="name headline"><a href="/2021/07/27/jvm-tlab/" class="post-title-link" itemprop="url">JVM TLAB</a></h2><div class="post-meta"><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i></span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2021-07-27 09:35:05" itemprop="dateCreated datePublished" datetime="2021-07-27T09:35:05+00:00">2021-07-27</time></span><span class="post-meta-item"><span class="post-meta-item-icon"><i class="fa fa-folder-o"></i></span> <span class="post-meta-item-text">分类于</span> <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/JVM/" itemprop="url" rel="index"><span itemprop="name">JVM</span></a></span></span><span id="/2021/07/27/jvm-tlab/" class="post-meta-item leancloud_visitors" data-flag-title="JVM TLAB" title="阅读次数"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span> <span class="post-meta-item-text">阅读次数:</span><span class="leancloud-visitors-count"></span></span><span class="post-meta-item"><a title="show comments" href="/2021/07/27/jvm-tlab/#show_comments"><span class="post-meta-item-icon"><i class="fa fa-comment-o"></i></span></a></span><span class="post-meta-item" title="本文字数"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i></span> <span>767</span></span><span class="post-meta-item" title="阅读时长"><span class="post-meta-item-icon"><i class="fa fa-clock-o"></i></span> <span>1 分钟</span></span></div></header><div class="post-body" itemprop="articleBody"><p><strong>TLAB(Thread Local Allocation Buffer)</strong> 线程本地分配缓存区</p><ol><li>由于对象一般分配在堆上,而堆是线程共用的,因此可能会有多个线程在堆上申请空间,而每一次的<strong>对象分配都必须加锁保证线程同步</strong>,会使分配的效率下降。考虑到对象分配几乎是 <code>Java</code> 中最常用的操作,因此 <code>JVM</code> 使用了 <code>TLAB</code> 这样的线程专有区域来避免多线程冲突,提高对象分配的效率。</li><li>我们说 <code>TLAB</code> 是线程独享的,但是只是在 <strong>“分配”</strong> 这个动作上是线程独享的,至于在读取、垃圾回收等动作上都是线程共享的。而且在使用上也没有什么区别</li><li><code>JVM</code> 为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间 <code>TLAB</code>,其大小由 <code>JVM</code> 根据运行的情况计算而得,在 <code>TLAB</code> 上分配对象时不需要加锁,因此 <strong>JVM 在给线程的对象分配内存时会尽量的在 TLAB 上分配</strong>,在这种情况下 JVM 中分配对象内存的性能和 <code>C</code> 基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配</li><li>在 <code>TLAB</code> 分配之后,并不影响对象的移动和回收,也就是说,虽然对象刚开始可能通过 <code>TLAB</code> 分配内存,存放在 <code>Eden</code> 区,但是还是会被垃圾回收或者被移到 <code>Survivor Space、Old Gen</code> 等。</li><li><strong>“堆是线程共享的内存区域” 这句话并不完全正确</strong>,因为 <code>TLAB</code> 是堆内存的一部分,它在读取上确实是线程共享的,但是在内存分配上,是线程独享的。</li><li><code>TLAB</code> 的空间其实并不大(默认是 <code>eden</code> 区空间的 <code>1%</code>),所以大对象还是可能需要在堆内存中直接分配。那么,对象的内存分配步骤就是先尝试 <code>TLAB</code> 分配,空间不足之后,再判断是否应该直接进入老年代,然后再确定是再 <code>eden</code> 分配还是在老年代分配。<div class="post-button"><a class="btn" href="/2021/07/27/jvm-tlab/#more" rel="contents">阅读全文 »</a></div></li></ol></div><footer class="post-footer"><div class="post-eof"></div></footer></article></div><nav class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><span class="space">…</span><a class="page-number" href="/page/17/">17</a><a class="extend next" rel="next" href="/page/2/"><i class="fa fa-angle-right" aria-label="下一页"></i></a></nav></div></div><div class="toggle sidebar-toggle"><span class="toggle-line toggle-line-first"></span><span class="toggle-line toggle-line-middle"></span><span class="toggle-line toggle-line-last"></span></div><aside class="sidebar"><div class="sidebar-inner"><ul class="sidebar-nav motion-element"><li class="sidebar-nav-toc">文章目录</li><li class="sidebar-nav-overview">站点概览</li></ul><div class="post-toc-wrap sidebar-panel"></div><div class="site-overview-wrap sidebar-panel"><div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"><img class="site-author-image" itemprop="image" src="https://cdn.jsdelivr.net/gh/0vo/oss/images/logo_2.png" alt="!!@_@ ᵛᵉ"><p class="site-author-name" itemprop="name">!!@_@ ᵛᵉ</p><div class="site-description" itemprop="description">瞻前顾后,惶惶不可终日</div></div><div class="site-state-wrap motion-element"><nav class="site-state"><div class="site-state-item site-state-posts"><a href="/archives/"><span class="site-state-item-count">85</span> <span class="site-state-item-name">日志</span></a></div><div class="site-state-item site-state-categories"><a href="/categories/"><span class="site-state-item-count">19</span> <span class="site-state-item-name">分类</span></a></div><div class="site-state-item site-state-tags"><a href="/tags/"><span class="site-state-item-count">66</span> <span class="site-state-item-name">标签</span></a></div></nav></div><div class="feed-link motion-element"><a href="/atom.xml" rel="alternate"><i class="fa fa-rss"></i> RSS</a></div><div class="links-of-author motion-element"><span class="links-of-author-item"><a href="/about" title="关于 &rarr; /about"><i class="fa fa-fw fa-user"></i></a></span><span class="links-of-author-item"><a href="/photos/" title="相册 &rarr; /photos/"><i class="fa fa-fw fa-image"></i></a></span><span class="links-of-author-item"><a href="http://t.me/ehlxr" title="TG &rarr; http://t.me/ehlxr" rel="noopener" target="_blank"><i class="fa fa-fw fa-telegram"></i></a></span><span class="links-of-author-item"><a href="https://github.com/ehlxr" title="GitHub &rarr; https://github.com/ehlxr" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i></a></span></div><div class="cc-license motion-element" itemprop="license"><a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" class="cc-opacity" rel="noopener" target="_blank"><img src="/images/cc-by-nc-sa.svg" alt="Creative Commons"></a></div><div class="links-of-blogroll motion-element"><div class="links-of-blogroll-title"><i class="fa fa-fw fa-link"></i> 友链</div><ul class="links-of-blogroll-list"><li class="links-of-blogroll-item"><a href="https://ehlxr.top/" title="https://ehlxr.top" rel="noopener" target="_blank">Home</a></li><li class="links-of-blogroll-item"><a href="https://about.me/ehlxr" title="https://about.me/ehlxr" rel="noopener" target="_blank">About me</a></li><li class="links-of-blogroll-item"><a href="https://mritd.me/" title="https://mritd.me" rel="noopener" target="_blank">漠然</a></li><li class="links-of-blogroll-item"><a href="http://wiliam.me/" title="http://wiliam.me" rel="noopener" target="_blank">Wiliam</a></li></ul></div></div></div></aside><div id="sidebar-dimmer"></div></div></main><footer id="footer" class="footer"><div class="footer-inner"><div class="copyright">© 2016 – <span itemprop="copyrightYear">2023</span><span class="with-love" id="animate"><i class="fa fa-anchor"></i></span> <span class="author" itemprop="copyrightHolder">!!@_@ ᵛᵉ</span> <span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-area-chart"></i></span> <span title="站点总字数">213k</span> <span class="post-meta-divider">|</span><span class="post-meta-item-icon"><i class="fa fa-coffee"></i></span> <span title="站点阅读时长">3:14</span></div><div class="powered-by">由 <a href="https://hexo.io/" class="theme-link" rel="noopener" target="_blank">Hexo</a> 强力驱动</div><span class="post-meta-divider">|</span><div class="theme-info">主题 – <a href="https://theme-next.org/" class="theme-link" rel="noopener" target="_blank">NexT.Mist</a></div><div class="busuanzi-count"><script pjax async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><span class="post-meta-item" id="busuanzi_container_site_uv" style="display:none"><span class="post-meta-item-icon"><i class="fa fa-user"></i></span><span class="site-uv" title="总访客量"><span id="busuanzi_value_site_uv"></span></span></span> <span class="post-meta-divider">|</span><span class="post-meta-item" id="busuanzi_container_site_pv" style="display:none"><span class="post-meta-item-icon"><i class="fa fa-eye"></i></span><span class="site-pv" title="总访问量"><span id="busuanzi_value_site_pv"></span></span></span></div><script pjax>function leancloudSelector(url) {
return document.getElementById(url).querySelector('.leancloud-visitors-count');
}
if (CONFIG.page.isPost) {
function addCount(Counter) {
var visitors = document.querySelector('.leancloud_visitors');
var url = visitors.getAttribute('id').trim();
var title = visitors.getAttribute('data-flag-title').trim();
Counter('get', `/classes/Counter?where=${JSON.stringify({ url })}`)
.then(response => response.json())
.then(({ results }) => {
if (results.length > 0) {
var counter = results[0];
Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
.then(response => response.json())
.then(() => {
leancloudSelector(url).innerText = counter.time + 1;
})
.catch(error => {
console.log('Failed to save visitor count', error);
})
} else {
Counter('post', '/classes/Counter', { title: title, url: url, time: 1 })
.then(response => response.json())
.then(() => {
leancloudSelector(url).innerText = 1;
})
.catch(error => {
console.log('Failed to create', error);
});
}
})
.catch(error => {
console.log('LeanCloud Counter Error', error);
});
}
} else {
function showTime(Counter) {
var visitors = document.querySelectorAll('.leancloud_visitors');
var entries = [...visitors].map(element => {
return element.getAttribute('id').trim();
});
Counter('get', `/classes/Counter?where=${JSON.stringify({ url: { '$in': entries } })}`)
.then(response => response.json())
.then(({ results }) => {
if (results.length === 0) {
document.querySelectorAll('.leancloud_visitors .leancloud-visitors-count').forEach(element => {
element.innerText = 0;
});
return;
}
for (var i = 0; i < results.length; i++) {
var item = results[i];
var url = item.url;
var time = item.time;
leancloudSelector(url).innerText = time;
}
for (var i = 0; i < entries.length; i++) {
var url = entries[i];
var element = leancloudSelector(url);
if (element.innerText == '') {
element.innerText = 0;
}
}
})
.catch(error => {
console.log('LeanCloud Counter Error', error);
});
}
}
fetch('https://app-router.leancloud.cn/2/route?appId=DVv225OiXLJTYs0Imq4Kw1qL-gzGzoHsz')
.then(response => response.json())
.then(({ api_server }) => {
var Counter = (method, url, data) => {
return fetch(`https://${api_server}/1.1${url}`, {
method: method,
headers: {
'X-LC-Id': 'DVv225OiXLJTYs0Imq4Kw1qL-gzGzoHsz',
'X-LC-Key': 'Kv6XNKTrebkacDbh2zRCsVYA',
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
};
if (CONFIG.page.isPost) {
const localhost = /http:\/\/(localhost|127.0.0.1|0.0.0.0)/;
if (localhost.test(document.URL)) return;
addCount(Counter);
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
showTime(Counter);
}
});</script></div></footer></div><script src="/lib/anime.min.js?v=3.1.0"></script><script src="//cdn.jsdelivr.net/npm/pjax/pjax.js"></script><script src="//cdn.jsdelivr.net/npm/medium-zoom@1/dist/medium-zoom.min.js"></script><script src="/lib/velocity/velocity.min.js?v=1.2.1"></script><script src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script><script src="/js/utils.js?v=7.4.1.js"></script><script src="/js/motion.js?v=7.4.1.js"></script><script src="/js/schemes/muse.js?v=7.4.1.js"></script><script src="/js/next-boot.js?v=7.4.1.js"></script><script>var pjax = new Pjax({
selectors: [
'head title',
'#page-configurations',
'.content-wrap',
'.post-toc-wrap',
'#pjax'
],
switches: {
'.post-toc-wrap': Pjax.switches.innerHTML
},
analytics: false,
cacheBust: false,
scrollTo : !CONFIG.bookmark.enable
});
window.addEventListener('pjax:success', () => {
document.querySelectorAll('script[pjax], script#page-configurations, #pjax script').forEach(element => {
var code = element.text || element.textContent || element.innerHTML || '';
var parent = element.parentNode;
parent.removeChild(element);
var script = document.createElement('script');
if (element.id) {
script.id = element.id;
}
if (element.src) {
script.src = element.src;
// Force synchronous loading of peripheral JS.
script.async = false;
}
if (element.getAttribute('pjax') !== null) {
element.setAttribute('pjax', '');
}
if (code !== '') {
script.appendChild(document.createTextNode(code));
}
parent.appendChild(script);
});
NexT.boot.refresh();
// Define Motion Sequence & Bootstrap Motion.
if (CONFIG.motion.enable) {
NexT.motion.integrator
.init()
.add(NexT.motion.middleWares.postList)
.bootstrap();
}
NexT.utils.updateSidebarPosition();
});</script><script pjax>CONFIG.page.isPost&&(wpac_init=window.wpac_init||[],wpac_init.push({widget:"Rating",id:6194,el:"wpac-rating",color:"fc6423"}),function(){if(!("WIDGETPACK_LOADED"in window)){WIDGETPACK_LOADED=!0;var e=document.createElement("script");e.type="text/javascript",e.async=!0,e.src="//embed.widgetpack.com/widget.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t.nextSibling)}}())</script><script src="/js/local-search.js?v=7.4.1.js"></script><script pjax>if (document.querySelectorAll('pre.mermaid').length) {
NexT.utils.getScript('//cdn.jsdelivr.net/npm/mermaid@8/dist/mermaid.min.js', () => {
mermaid.initialize({
theme: 'forest',
logLevel: 3,
flowchart: { curve: 'linear' },
gantt: { axisFormat: '%m/%d/%Y' },
sequence: { actorMargin: 50 }
});
}, window.mermaid);
}</script><link rel="stylesheet" href="/lib/player/player.css"><div id="QPlayer"><div id="pContent"><div id="player"><span class="cover"></span><div class="ctrl"><div class="musicTag marquee"><strong>Title</strong> <span>-</span> <span class="artist">Artist</span></div><div class="progress"><div class="timer left">0:00</div><div class="contr"><div class="rewind icon"></div><div class="playback icon"></div><div class="fastforward icon"></div></div><div class="right"><div class="liebiao icon"></div></div></div></div></div><div class="ssBtn"><div class="adf on"></div></div></div><ol id="playlist"></ol></div><script>var playlist=[];playlist.push({title:"再见杰克",artist:"痛仰乐队",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/痛仰乐队%20-%20再见杰克.mp3",cover:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/痛仰乐队%20-%20再见杰克.jpg"}),playlist.push({title:"公路之歌",artist:"痛仰乐队",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/痛仰乐队%20-%20公路之歌.mp3",cover:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/痛仰乐队%20-%20再见杰克.jpg"}),playlist.push({title:"时光机",artist:"周杰伦",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/周杰伦%20-%20时光机.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000002Neh8l0uciQZ.jpg"}),playlist.push({title:"一路向北",artist:"周杰伦",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/周杰伦-一路向北.mp3",cover:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/%E5%91%A8%E6%9D%B0%E4%BC%A6%20-%20%E4%B8%80%E8%B7%AF%E5%90%91%E5%8C%97.jpg"}),playlist.push({title:"ビンクスの酒 (宾克斯的美酒)",artist:"麦わらの一味 (草帽海贼团)",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/%E3%83%93%E3%83%B3%E3%82%AF%E3%82%B9%E3%81%AE%E9%85%92%20(%E5%AE%BE%E5%85%8B%E6%96%AF%E7%9A%84%E7%BE%8E%E9%85%92).mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M00000367oF43ZdHan.jpg"}),playlist.push({title:"青鸟 ブルーバード",artist:"火影",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/青鸟%20ブルーバード.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000001GUvKQ3q6Tdr.jpg"}),playlist.push({title:"Five Hundred Miles",artist:"醉乡民谣",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/Five-Hundred-Miles.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000003NY5cG15yFa7.jpg"}),playlist.push({title:"Scarborough Fair/Canticle",artist:"Simon & Garfunkel",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/Scarborough-Fair.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000003U9s1H1EEBvn.jpg"}),playlist.push({title:"What are words",artist:"What are words",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/What-are-words.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000003N49f81g9SE1.jpg"}),playlist.push({title:"See You Again",artist:"Taylor Gang Timeline (Mixtape)",mp3:"https://cdn.jsdelivr.net/gh/0vo/oss/mp3/See-You-Again.mp3",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000003K7HZQ04YTIF.jpg"});var isRotate=!0,autoplay=!1,showBtn=!1</script><script>function bgChange(){for(var n=$(".lib"),g=0;g<n.length;g+=2)n[g].style.background="rgba(246, 246, 246, 0.5)"}window.onload=bgChange</script><script src="/lib/jquery/index.js"></script><script src="/lib/player/jquery.marquee.min.js"></script><script src="/lib/player/player.js"></script><div id="pjax"><script src="//cdn.jsdelivr.net/npm/quicklink@1/dist/quicklink.umd.js"></script><script>window.addEventListener('load', () => {
quicklink({
timeout: 3000,
priority: true,
ignores: [uri => uri.includes('#'),uri => uri == 'https://ehlxr.me/',]
});
});</script><div id="needsharebutton-float"><span class="btn"><i class="fa fa-share-alt" aria-hidden="true"></i></span></div><script src="//cdn.jsdelivr.net/gh/theme-next/theme-next-needmoreshare2@1/needsharebutton.min.js"></script><script>pbOptions={iconStyle:"default",boxForm:"horizontal",position:"bottomCenter",networks:"Weibo,Wechat,Douban,Evernote,QQZone,Twitter,Facebook,GooglePlus,Tumblr,Linkedin"},new needShareButton("#needsharebutton-postbottom",pbOptions),flOptions={iconStyle:"default",boxForm:"horizontal",position:"topRight",networks:"Weibo,Wechat,Douban,Evernote,QQZone,Twitter,Facebook,GooglePlus,Tumblr,Linkedin"},new needShareButton("#needsharebutton-float",flOptions)</script><script>((w, d) => {
'use strict';
// d.documentElement.className = 'darkScheme';
const btn = d.querySelector('.night-btn');
var clickAction = function () {
d.documentElement.classList.toggle('darkScheme');
if ( d.documentElement.classList.contains('darkScheme') ) {
localStorage.setItem('Scheme', 'Dark');
} else {
localStorage.removeItem('Scheme');
}
}
const hasClickListener = localStorage.getItem('hasClickListener');
if(!hasClickListener){
btn.addEventListener('click', clickAction, false);
localStorage.setItem('hasClickListener', true);
}
})(window, document);</script><script>NexT.utils.getScript('//unpkg.com/valine/dist/Valine.min.js', () => {
var GUEST = ['nick', 'mail', 'link'];
var guest = 'nick,mail,link';
guest = guest.split(',').filter(item => {
return GUEST.includes(item);
});
new Valine({
el: '#comments',
verify: false,
notify: false,
appId: 'c4sS2ybYQtvpyjiHDVw4mjsx-gzGzoHsz',
appKey: 'Jk2rTF2UusPYm6632MNnaCqv',
placeholder: '说点什么吧...',
avatar: 'mm',
meta: guest,
pageSize: '10' || 10,
visitor: false,
lang: '' || 'zh-cn',
// ehlxr
path: '/index.html',
recordIP: false,
serverURLs: ''
});
}, window.Valine);</script></div></body></html>