-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
538 lines (376 loc) · 43.9 KB
/
Copy pathindex.html
File metadata and controls
538 lines (376 loc) · 43.9 KB
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
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QingYang's Blog</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta property="og:type" content="website">
<meta property="og:title" content="QingYang's Blog">
<meta property="og:url" content="http://example.com/index.html">
<meta property="og:site_name" content="QingYang's Blog">
<meta property="og:locale" content="zh_CN">
<meta property="article:author" content="xqy">
<meta name="twitter:card" content="summary">
<link rel="alternate" href="/atom.xml" title="QingYang's Blog" type="application/atom+xml">
<link rel="shortcut icon" href="/favicon.png">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/fancybox/jquery.fancybox.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css">
<meta name="generator" content="Hexo 7.3.0"></head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">QingYang's Blog</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"><span class="fa fa-bars"></span></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a class="nav-icon" href="/atom.xml" title="RSS 订阅"><span class="fa fa-rss"></span></a>
<a class="nav-icon nav-search-btn" title="搜索"><span class="fa fa-search"></span></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="搜索"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://example.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-springai-vs-langchain4j" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/06/10/springai-vs-langchain4j/" class="article-date">
<time class="dt-published" datetime="2025-06-10T12:14:00.000Z" itemprop="datePublished">2025-06-10</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/">技术文档</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/06/10/springai-vs-langchain4j/">SpringAI与Langchain4j比较</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="SpringAI-与-Langchain4j-比较"><a href="#SpringAI-与-Langchain4j-比较" class="headerlink" title="SpringAI 与 Langchain4j 比较"></a>SpringAI 与 Langchain4j 比较</h1><h2 id="1-SpringAI-简介"><a href="#1-SpringAI-简介" class="headerlink" title="1. SpringAI 简介"></a>1. SpringAI 简介</h2><p>SpringAI 是 Spring 官方推出的 AI 集成框架,主要特点包括:</p>
<ul>
<li>深度集成 Spring 生态</li>
<li>提供统一的 AI 服务抽象层</li>
<li>支持多种大模型(OpenAI, Azure OpenAI等)</li>
<li>自动配置和启动器支持</li>
<li>丰富的模板和工具类</li>
</ul>
<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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// SpringAI 示例代码</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AIController</span> {</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ChatClient chatClient;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/ask")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">ask</span><span class="params">(<span class="meta">@RequestParam</span> String question)</span> {</span><br><span class="line"> <span class="keyword">return</span> chatClient.call(question);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="2-Langchain4j-简介"><a href="#2-Langchain4j-简介" class="headerlink" title="2. Langchain4j 简介"></a>2. Langchain4j 简介</h2><p>Langchain4j 是 Java 版的 LangChain,主要特点包括:</p>
<ul>
<li>灵感来自 Python 的 LangChain</li>
<li>轻量级设计</li>
<li>支持多种大模型和向量数据库</li>
<li>提供链(Chain)、工具(Tools)等高级抽象</li>
<li>活跃的社区支持</li>
</ul>
<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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Langchain4j 示例代码</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ChatExample</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">ChatLanguageModel</span> <span class="variable">model</span> <span class="operator">=</span> OpenAiChatModel.builder()</span><br><span class="line"> .apiKey(<span class="string">"demo"</span>)</span><br><span class="line"> .build();</span><br><span class="line"> </span><br><span class="line"> <span class="type">String</span> <span class="variable">answer</span> <span class="operator">=</span> model.generate(<span class="string">"你好"</span>);</span><br><span class="line"> System.out.println(answer);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="3-比较分析"><a href="#3-比较分析" class="headerlink" title="3. 比较分析"></a>3. 比较分析</h2><table>
<thead>
<tr>
<th>特性</th>
<th>SpringAI</th>
<th>Langchain4j</th>
</tr>
</thead>
<tbody><tr>
<td>出身</td>
<td>Spring官方</td>
<td>社区驱动</td>
</tr>
<tr>
<td>设计理念</td>
<td>企业级集成</td>
<td>灵活轻量</td>
</tr>
<tr>
<td>学习曲线</td>
<td>中等(需Spring知识)</td>
<td>较低</td>
</tr>
<tr>
<td>功能完整性</td>
<td>基础AI功能</td>
<td>更丰富的链式功能</td>
</tr>
<tr>
<td>性能</td>
<td>优化较好</td>
<td>中等</td>
</tr>
<tr>
<td>文档</td>
<td>官方文档完善</td>
<td>社区文档为主</td>
</tr>
<tr>
<td>适用场景</td>
<td>Spring项目集成AI</td>
<td>快速原型/实验性项目</td>
</tr>
</tbody></table>
<h2 id="4-如何选择"><a href="#4-如何选择" class="headerlink" title="4. 如何选择"></a>4. 如何选择</h2><ul>
<li><p><strong>选择SpringAI</strong> 如果:</p>
<ul>
<li>已经是Spring技术栈</li>
<li>需要企业级支持和长期维护</li>
<li>需要深度Spring集成</li>
</ul>
</li>
<li><p><strong>选择Langchain4j</strong> 如果:</p>
<ul>
<li>需要快速实验AI功能</li>
<li>需要更灵活的链式编程</li>
<li>项目不基于Spring</li>
</ul>
</li>
</ul>
<h2 id="5-总结"><a href="#5-总结" class="headerlink" title="5. 总结"></a>5. 总结</h2><p>两者都是Java生态中优秀的AI集成方案,选择取决于具体项目需求和技术栈。</p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2025/06/10/springai-vs-langchain4j/" data-id="cmbqiqauz0005tgneftj01kmd" data-title="SpringAI与Langchain4j比较" class="article-share-link"><span class="fa fa-share">分享</span></a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/AI/" rel="tag">AI</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/" rel="tag">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/LLM/" rel="tag">LLM</a></li></ul>
</footer>
</div>
</article>
<article id="post-java-jvm-core-principles" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/06/10/java-jvm-core-principles/" class="article-date">
<time class="dt-published" datetime="2025-06-10T12:07:50.000Z" itemprop="datePublished">2025-06-10</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/06/10/java-jvm-core-principles/">Java JVM核心原理与机制</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<p>技术分享</p>
<p>大家好,我是你的技术伙伴。在Java世界里,我们每天都在编写着优雅的代码,但你是否想过,这些代码是如何被计算机理解并执行的?答案就在于Java的“心脏”——JVM(Java Virtual Machine)。理解JVM,是从“会用Java”到“精通Java”的关键一步。今天,我们就用最通俗的语言,来一场深入JVM核心的探索之旅。</p>
<h2 id="什么是JVM?为什么它如此重要?"><a href="#什么是JVM?为什么它如此重要?" class="headerlink" title="什么是JVM?为什么它如此重要?"></a>什么是JVM?为什么它如此重要?</h2><p>想象一下,你是一位周游世界的演讲家。如果你每到一个国家,就要把演讲稿翻译成当地语言,那将非常低效。但如果你有一位随身的“万能翻译官”,你只需要准备一份稿子,他就能在任何国家将其实时翻译给当地听众。</p>
<p>JVM,就是Java代码的那个“万能翻译官”。</p>
<p>我们编写的.java文件,通过编译器(javac)被编译成一种叫做“字节码”(Bytecode)的.class文件。这种字节码并非任何物理计算机能直接执行的机器码,而是一种中间语言。JVM的核心使命,就是将这种平台无关的字节码,翻译成特定操作系统和CPU能懂的机器码并执行。</p>
<p>正是因为JVM的存在,Java才能自豪地宣称 “一次编写,到处运行”(Write Once, Run Anywhere)。</p>
<p>一个完整的JVM主要包括三个核心部分:类加载器(Class Loader)、运行时数据区(Runtime Data Area) 和 执行引擎(Execution Engine)。我们一个一个来看。</p>
<h2 id="第一站:类加载器-代码的搬运工"><a href="#第一站:类加载器-代码的搬运工" class="headerlink" title="第一站:类加载器 - 代码的搬运工"></a>第一站:类加载器 - 代码的搬运工</h2><p>当你的程序需要使用某个类时(比如 new User()),JVM并不会在一开始就把所有类都加载进来。它采用的是按需加载。类加载器(Class Loader)就是负责把.class文件的字节码从硬盘“搬运”到内存中的“工人”。</p>
<p>这个搬运过程分为三个主要步骤:</p>
<p>加载(Loading): 这是纯粹的“搬运”。类加载器根据类的全限定名(如 com.example.User),找到对应的.class文件,读取其二进制数据,并在内存中创建一个java.lang.Class对象。这个对象就像是该类在JVM中的“身份证”。</p>
<p>链接(Linking): 这是“整理和校验”的过程。</p>
<p>验证(Verification): 确保加载进来的字节码是符合JVM规范的、安全的。就像安检员,防止恶意代码破坏JVM。</p>
<p>准备(Preparation): 为类的静态变量(static fields)分配内存,并设置其默认初始值。比如 static int value = 123; 在准备阶段,value会被赋值为 0(int的默认值),而不是123。</p>
<p>解析(Resolution): 将代码中的符号引用(比如类名、方法名)替换为直接的内存地址引用。好比把通讯录里的“张三”这个名字,直接换成他家的门牌号,方便快速找到。</p>
<p>初始化(Initialization): 这是类加载的最后一步。到了这一步,JVM才真正开始执行类中定义的Java程序代码。它会执行类的<clinit>()方法(编译器自动收集所有静态变量的赋值动作和静态代码块static{}合并产生的),将静态变量赋上我们代码中写的初始值。比如,在这一步,前面提到的value才会被赋值为123。</p>
<p>双亲委派模型(Parent Delegation Model)<br>这是一个非常经典的设计。JVM的类加载器是有层级关系的(像一个家庭)。当一个类加载器收到加载请求时,它不会自己先去加载,而是先把请求“甩锅”给它的父加载器。层层甩锅,直到最顶层的启动类加载器(Bootstrap ClassLoader)。只有当父加载器找不到时,子加载器才会自己尝试加载。</p>
<p>这么做的好处是什么?<br>安全! 它可以防止Java的核心API被篡改。比如,你自己写一个java.lang.String类,想替代系统自带的。在双亲委派模型下,加载请求最终会到达顶层加载器,它会加载JDK自带的String类,而你写的那个恶意String类根本没有机会被加载。</p>
<h2 id="第二站:运行时数据区-JVM的内存帝国"><a href="#第二站:运行时数据区-JVM的内存帝国" class="headerlink" title="第二站:运行时数据区 - JVM的内存帝国"></a>第二站:运行时数据区 - JVM的内存帝国</h2><p>当类被加载后,JVM会划分出一块内存区域来存储运行时的数据。这块区域就是“运行时数据区”,它也是JVM最复杂、最核心的部分,更是JVM调优的重点关注区域。</p>
<p>[图片描述:JVM运行时数据区结构图]</p>
<p>它主要分为两大块:线程私有区和线程共享区。</p>
<p>线程私有区(每个线程都有一份)<br>程序计数器(Program Counter Register): 把它想象成代码的“书签”。它记录着当前线程正在执行的字节码指令的地址。因为Java支持多线程,每个线程都需要自己的书签来记住执行到哪了,所以它是线程私有的。</p>
<p>Java虚拟机栈(Java Virtual Machine Stack): 这是最常和“栈”这个词关联的地方。每个方法在被调用时,都会在虚拟机栈里创建一个“栈帧(Stack Frame)”。栈帧里存放着这个方法的局部变量表(我们定义的int a = 1;就在这里)、操作数栈、动态链接等信息。方法调用开始,栈帧入栈;方法调用结束,栈帧出栈。我们常说的“栈溢出”(StackOverflowError)就是因为方法调用层次太深,栈帧太多把这个区域撑爆了。</p>
<p>本地方法栈(Native Method Stack): 和虚拟机栈类似,但它是为native方法服务的。当代码调用一个本地方法(比如用C++写的底层方法)时,就在这里管理。</p>
<p>线程共享区(所有线程共享一份)<br>堆(Heap): JVM内存中最大的一块! 它的唯一使命就是存放对象实例(new出来的东西)和数组。堆是垃圾回收器(GC)进行垃圾回收的“主战场”。我们常说的“内存溢出”(OutOfMemoryError)绝大多数情况都发生在这里。</p>
<p>方法区(Method Area): 它存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码等数据。可以把它看作是类的“户籍档案室”。</p>
<p>元空间(Metaspace): 在Java 8及以后,方法区的实现变成了“元空间”。它最大的特点是使用本地内存(Native Memory),而不是JVM自身的内存。这样做的好处是,只要你的物理机内存足够大,就不太容易发生方法区的内存溢出。</p>
<h2 id="第三站:执行引擎-JVM的CPU"><a href="#第三站:执行引擎-JVM的CPU" class="headerlink" title="第三站:执行引擎 - JVM的CPU"></a>第三站:执行引擎 - JVM的CPU</h2><p>有了代码(Class对象),有了内存(运行时数据区),接下来就需要一个“CPU”来执行这些代码。执行引擎(Execution Engine) 就扮演了这个角色。</p>
<p>它拿到字节码后,如何执行呢?主要有两种方式:</p>
<p>解释器(Interpreter): 像一个同声传译。它读取字节码,一行一行地解释成机器码并执行。优点是启动快,但对于重复执行的代码(热点代码),每次都要重新解释,效率较低。</p>
<p>即时编译器(JIT Compiler): JVM的性能功臣。它会在程序运行时,把那些被频繁调用的“热点代码”直接编译成当前平台最高效的本地机器码,并缓存起来。下次再执行这段代码时,直接运行编译好的机器码,速度飞快。</p>
<p>现代JVM(如HotSpot)都采用解释器与JIT编译器混合的模式,兼顾了启动速度和长期运行的性能。</p>
<h2 id="特别篇:垃圾回收-默默无闻的管家"><a href="#特别篇:垃圾回收-默默无闻的管家" class="headerlink" title="特别篇:垃圾回收 - 默默无闻的管家"></a>特别篇:垃圾回收 - 默默无闻的管家</h2><p>既然堆里存放了那么多对象,内存总有被用完的一天。如果手动管理内存(像C++那样),将是一场噩梦。Java的伟大之处在于它有垃圾回收(Garbage Collection, GC) 机制,这位“管家”会自动清理不再使用的对象,释放内存。</p>
<p>如何判断对象是“垃圾”?<br>主流JVM采用的是可达性分析算法(Reachability Analysis)。<br>原理很简单:从一系列被称为“GC Roots”的根对象(比如虚拟机栈中引用的对象、静态变量引用的对象等)开始,向下搜索。凡是能从GC Roots通过引用链访问到的对象,都被认为是“存活”的;反之,就是“垃圾”。</p>
<p>常见的垃圾回收算法<br>标记-清除(Mark-Sweep): 先标记出所有存活对象,然后统一清除所有未被标记的对象。缺点是容易产生大量内存碎片。</p>
<p>标记-复制(Mark-Copy): 将内存分为两块,每次只用其中一块。GC时,将存活对象复制到另一块空闲内存上,然后把当前这块全部清空。优点是无碎片,但浪费了一半的内存空间。</p>
<p>标记-整理(Mark-Compact): 先标记存活对象,然后把它们全部向内存的一端移动,最后清理掉端边界以外的内存。</p>
<p>分代收集(Generational Collection)<br>这是现代JVM最核心的GC策略。研究发现,绝大多数Java对象都是“短命”的。于是,GC将堆分为了新生代(Young Generation) 和 老年代(Old Generation)。</p>
<p>新生代: 存放新创建的对象。每次GC时,大量对象被回收。采用标记-复制算法,效率高。</p>
<p>老年代: 新生代里经过数次GC还“健在”的对象,会被晋升到老年代。老年代的对象生命周期长,GC频率低。采用标记-清除或标记-整理算法。</p>
<p>这种“区别对待”的策略,极大地提升了GC的效率。</p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>回顾我们的旅程:<br>一份.java代码,经过编译,由类加载器搬进JVM的运行时数据区。然后,执行引擎通过解释和即时编译技术执行代码,期间产生的对象在堆中诞生与消亡。而垃圾回收器则像一位不知疲倦的管家,时刻保持着内存的整洁。</p>
<p>理解JVM,不仅仅是为了应付面试。它能让你写出更高效、更稳定的代码,能在遇到OOM、StackOverflow等棘手问题时,拥有从容定位和解决问题的能力。这,就是高级程序员和普通程序员之间真正的分水岭。</p>
<p>希望这次的JVM之旅对你有所启发!</p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2025/06/10/java-jvm-core-principles/" data-id="cmbqiqaux0002tgne9l8de8fq" data-title="Java JVM核心原理与机制" class="article-share-link"><span class="fa fa-share">分享</span></a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/java/" rel="tag">java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/jvm/" rel="tag">jvm</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/" rel="tag">虚拟机</a></li></ul>
</footer>
</div>
</article>
<article id="post-jdk-source-code-analysis" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/06/10/jdk-source-code-analysis/" class="article-date">
<time class="dt-published" datetime="2025-06-10T12:00:00.000Z" itemprop="datePublished">2025-06-10</time>
</a>
<div class="article-category">
<a class="article-category-link" href="/categories/Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF/">Java核心技术</a>
</div>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/06/10/jdk-source-code-analysis/">JDK源码深度解析:集合与并发工具类</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<h1 id="JDK源码深度解析:集合与并发工具类"><a href="#JDK源码深度解析:集合与并发工具类" class="headerlink" title="JDK源码深度解析:集合与并发工具类"></a>JDK源码深度解析:集合与并发工具类</h1><h2 id="一、集合框架源码分析"><a href="#一、集合框架源码分析" class="headerlink" title="一、集合框架源码分析"></a>一、集合框架源码分析</h2><h3 id="1-ArrayList源码解析"><a href="#1-ArrayList源码解析" class="headerlink" title="1. ArrayList源码解析"></a>1. ArrayList源码解析</h3><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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ArrayList核心代码示例</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArrayList</span><E> <span class="keyword">extends</span> <span class="title class_">AbstractList</span><E></span><br><span class="line"> <span class="keyword">implements</span> <span class="title class_">List</span><E>, RandomAccess, Cloneable, java.io.Serializable {</span><br><span class="line"> <span class="keyword">transient</span> Object[] elementData;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> size;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">add</span><span class="params">(E e)</span> {</span><br><span class="line"> ensureCapacityInternal(size + <span class="number">1</span>);</span><br><span class="line"> elementData[size++] = e;</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>底层实现:动态数组</li>
<li>扩容机制:grow()方法实现1.5倍扩容</li>
<li>快速失败机制:modCount实现</li>
</ul>
<h3 id="2-HashMap源码解析"><a href="#2-HashMap源码解析" class="headerlink" title="2. HashMap源码解析"></a>2. HashMap源码解析</h3><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="comment">// HashMap核心结构</span></span><br><span class="line"><span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Node</span><K,V> <span class="keyword">implements</span> <span class="title class_">Map</span>.Entry<K,V> {</span><br><span class="line"> <span class="keyword">final</span> <span class="type">int</span> hash;</span><br><span class="line"> <span class="keyword">final</span> K key;</span><br><span class="line"> V value;</span><br><span class="line"> Node<K,V> next;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>哈希冲突解决:链表+红黑树</li>
<li>扩容机制:2的幂次方扩容</li>
<li>hash算法:(h = key.hashCode()) ^ (h >>> 16)</li>
</ul>
<h2 id="二、AQS框架解析"><a href="#二、AQS框架解析" class="headerlink" title="二、AQS框架解析"></a>二、AQS框架解析</h2><h3 id="1-AbstractQueuedSynchronizer核心结构"><a href="#1-AbstractQueuedSynchronizer核心结构" class="headerlink" title="1. AbstractQueuedSynchronizer核心结构"></a>1. AbstractQueuedSynchronizer核心结构</h3><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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="keyword">class</span> <span class="title class_">AbstractQueuedSynchronizer</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">transient</span> <span class="keyword">volatile</span> Node head;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">transient</span> <span class="keyword">volatile</span> Node tail;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">volatile</span> <span class="type">int</span> state;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">Node</span> {</span><br><span class="line"> <span class="keyword">volatile</span> <span class="type">int</span> waitStatus;</span><br><span class="line"> <span class="keyword">volatile</span> Node prev;</span><br><span class="line"> <span class="keyword">volatile</span> Node next;</span><br><span class="line"> <span class="keyword">volatile</span> Thread thread;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>CLH队列实现</li>
<li>状态管理:state变量</li>
<li>模板方法模式:tryAcquire/tryRelease</li>
</ul>
<h2 id="三、并发工具类源码分析"><a href="#三、并发工具类源码分析" class="headerlink" title="三、并发工具类源码分析"></a>三、并发工具类源码分析</h2><h3 id="1-ReentrantLock实现原理"><a href="#1-ReentrantLock实现原理" class="headerlink" title="1. ReentrantLock实现原理"></a>1. ReentrantLock实现原理</h3><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><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReentrantLock</span> <span class="keyword">implements</span> <span class="title class_">Lock</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Sync sync;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">abstract</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Sync</span> <span class="keyword">extends</span> <span class="title class_">AbstractQueuedSynchronizer</span> {</span><br><span class="line"> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">nonfairTryAcquire</span><span class="params">(<span class="type">int</span> acquires)</span> {</span><br><span class="line"> <span class="comment">// 获取锁实现</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>公平锁与非公平锁实现差异</li>
<li>可重入实现:state计数</li>
<li>Condition实现原理</li>
</ul>
<h3 id="2-Semaphore源码分析"><a href="#2-Semaphore源码分析" class="headerlink" title="2. Semaphore源码分析"></a>2. Semaphore源码分析</h3><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="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Semaphore</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> Sync sync;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">acquire</span><span class="params">()</span> <span class="keyword">throws</span> InterruptedException {</span><br><span class="line"> sync.acquireSharedInterruptibly(<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>共享锁实现</li>
<li>令牌桶算法应用</li>
</ul>
<h3 id="3-CountDownLatch实现"><a href="#3-CountDownLatch实现" class="headerlink" title="3. CountDownLatch实现"></a>3. CountDownLatch实现</h3><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="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CountDownLatch</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">Sync</span> <span class="keyword">extends</span> <span class="title class_">AbstractQueuedSynchronizer</span> {</span><br><span class="line"> <span class="keyword">protected</span> <span class="type">int</span> <span class="title function_">tryAcquireShared</span><span class="params">(<span class="type">int</span> acquires)</span> {</span><br><span class="line"> <span class="keyword">return</span> (getState() == <span class="number">0</span>) ? <span class="number">1</span> : -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>一次性栅栏实现</li>
<li>state倒计时机制</li>
</ul>
<h3 id="4-ThreadLocal原理"><a href="#4-ThreadLocal原理" class="headerlink" title="4. ThreadLocal原理"></a>4. ThreadLocal原理</h3><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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ThreadLocal</span><T> {</span><br><span class="line"> <span class="keyword">public</span> T <span class="title function_">get</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">Thread</span> <span class="variable">t</span> <span class="operator">=</span> Thread.currentThread();</span><br><span class="line"> <span class="type">ThreadLocalMap</span> <span class="variable">map</span> <span class="operator">=</span> getMap(t);</span><br><span class="line"> <span class="keyword">if</span> (map != <span class="literal">null</span>) {</span><br><span class="line"> ThreadLocalMap.<span class="type">Entry</span> <span class="variable">e</span> <span class="operator">=</span> map.getEntry(<span class="built_in">this</span>);</span><br><span class="line"> <span class="keyword">if</span> (e != <span class="literal">null</span>)</span><br><span class="line"> <span class="keyword">return</span> (T)e.value;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> setInitialValue();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li>线程隔离实现原理</li>
<li>ThreadLocalMap哈希冲突解决</li>
<li>内存泄漏问题与解决方案</li>
</ul>
<h2 id="四、总结与最佳实践"><a href="#四、总结与最佳实践" class="headerlink" title="四、总结与最佳实践"></a>四、总结与最佳实践</h2><ol>
<li>集合类选择指南</li>
<li>并发工具适用场景对比</li>
<li>性能优化建议</li>
<li>常见问题排查</li>
</ol>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2025/06/10/jdk-source-code-analysis/" data-id="cmbqiqauw0001tgnegu1gezvw" data-title="JDK源码深度解析:集合与并发工具类" class="article-share-link"><span class="fa fa-share">分享</span></a>
<ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/JDK%E6%BA%90%E7%A0%81/" rel="tag">JDK源码</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/" rel="tag">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/" rel="tag">并发编程</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/" rel="tag">集合框架</a></li></ul>
</footer>
</div>
</article>
<article id="post-hello-world" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
<div class="article-meta">
<a href="/2025/06/10/hello-world/" class="article-date">
<time class="dt-published" datetime="2025-06-10T11:30:29.606Z" itemprop="datePublished">2025-06-10</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="p-name article-title" href="/2025/06/10/hello-world/">Hello World</a>
</h1>
</header>
<div class="e-content article-entry" itemprop="articleBody">
<p>Welcome to <a target="_blank" rel="noopener" href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a target="_blank" rel="noopener" href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a target="_blank" rel="noopener" href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a target="_blank" rel="noopener" href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/writing.html">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/server.html">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/generating.html">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a target="_blank" rel="noopener" href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>
</div>
<footer class="article-footer">
<a data-url="http://example.com/2025/06/10/hello-world/" data-id="cmbqiqauu0000tgne1hvwerzz" data-title="Hello World" class="article-share-link"><span class="fa fa-share">分享</span></a>
</footer>
</div>
</article>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">分类</h3>
<div class="widget">
<ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF/">Java核心技术</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/">技术文档</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">标签</h3>
<div class="widget">
<ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/tags/AI/" rel="tag">AI</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/JDK%E6%BA%90%E7%A0%81/" rel="tag">JDK源码</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java/" rel="tag">Java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/LLM/" rel="tag">LLM</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java/" rel="tag">java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/jvm/" rel="tag">jvm</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/" rel="tag">并发编程</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/" rel="tag">虚拟机</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/" rel="tag">集合框架</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">标签云</h3>
<div class="widget tagcloud">
<a href="/tags/AI/" style="font-size: 10px;">AI</a> <a href="/tags/JDK%E6%BA%90%E7%A0%81/" style="font-size: 10px;">JDK源码</a> <a href="/tags/Java/" style="font-size: 20px;">Java</a> <a href="/tags/LLM/" style="font-size: 10px;">LLM</a> <a href="/tags/java/" style="font-size: 10px;">java</a> <a href="/tags/jvm/" style="font-size: 10px;">jvm</a> <a href="/tags/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/" style="font-size: 10px;">并发编程</a> <a href="/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/" style="font-size: 10px;">虚拟机</a> <a href="/tags/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/" style="font-size: 10px;">集合框架</a>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">归档</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2025/06/">六月 2025</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">最新文章</h3>
<div class="widget">
<ul>
<li>
<a href="/2025/06/10/springai-vs-langchain4j/">SpringAI与Langchain4j比较</a>
</li>
<li>
<a href="/2025/06/10/java-jvm-core-principles/">Java JVM核心原理与机制</a>
</li>
<li>
<a href="/2025/06/10/jdk-source-code-analysis/">JDK源码深度解析:集合与并发工具类</a>
</li>
<li>
<a href="/2025/06/10/hello-world/">Hello World</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2025 xqy<br>
Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="/js/jquery-3.6.4.min.js"></script>
<script src="/fancybox/jquery.fancybox.min.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>