Skip to content

Commit f711703

Browse files
committed
docs: 新增 JVM 面试题与后端项目面试指南,优化多篇文档
1 parent 858d0d3 commit f711703

13 files changed

Lines changed: 1258 additions & 402 deletions

docs/.vuepress/sidebar/index.ts

Lines changed: 78 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,26 @@ export default sidebar({
4545
text: "面试准备知识体系",
4646
link: "/interview-preparation/",
4747
},
48-
{ text: "Java 后端面试通关计划", link: "backend-interview-plan" },
49-
"teach-you-how-to-prepare-for-the-interview-hand-in-hand",
50-
"resume-guide",
51-
{ text: "Java 后端面试重点总结", link: "key-points-of-interview" },
48+
{ text: "⭐Java 后端面试通关计划", link: "backend-interview-plan" },
49+
{
50+
text: "⭐如何高效准备 Java 面试?",
51+
link: "teach-you-how-to-prepare-for-the-interview-hand-in-hand",
52+
},
53+
{ text: "⭐程序员简历编写指南", link: "resume-guide" },
54+
{
55+
text: "⭐Java 后端面试重点总结",
56+
link: "key-points-of-interview",
57+
},
5258
{
5359
text: "Java 面试 + 后端面试 PDF 资料",
5460
link: "pdf-interview-javaguide",
5561
},
5662
{ text: "Java 学习路线", link: "java-roadmap" },
57-
"project-experience-guide",
63+
{ text: "⭐项目经验指南", link: "project-experience-guide" },
64+
{
65+
text: "⭐后端项目面试怎么讲?",
66+
link: "backend-project-interview-guide",
67+
},
5868
"how-to-handle-interview-nerves",
5969
"internship-experience",
6070
],
@@ -74,9 +84,18 @@ export default sidebar({
7484
prefix: "basis/",
7585
icon: ICONS.BASIC,
7686
children: [
77-
"java-basic-questions-01",
78-
"java-basic-questions-02",
79-
"java-basic-questions-03",
87+
{
88+
text: "⭐Java 基础常见面试题(上)",
89+
link: "java-basic-questions-01",
90+
},
91+
{
92+
text: "⭐Java 基础常见面试题(中)",
93+
link: "java-basic-questions-02",
94+
},
95+
{
96+
text: "⭐Java 基础常见面试题(下)",
97+
link: "java-basic-questions-03",
98+
},
8099
createImportantSection([
81100
"why-there-only-value-passing-in-java",
82101
"serialization",
@@ -99,8 +118,14 @@ export default sidebar({
99118
prefix: "collection/",
100119
icon: ICONS.CONTAINER,
101120
children: [
102-
"java-collection-questions-01",
103-
"java-collection-questions-02",
121+
{
122+
text: "⭐Java 集合常见面试题(上)",
123+
link: "java-collection-questions-01",
124+
},
125+
{
126+
text: "⭐Java 集合常见面试题(下)",
127+
link: "java-collection-questions-02",
128+
},
104129
"java-collection-precautions-for-use",
105130
createSourceCodeSection([
106131
"arraylist-source-code",
@@ -120,9 +145,18 @@ export default sidebar({
120145
prefix: "concurrent/",
121146
icon: ICONS.PERFORMANCE,
122147
children: [
123-
"java-concurrent-questions-01",
124-
"java-concurrent-questions-02",
125-
"java-concurrent-questions-03",
148+
{
149+
text: "⭐Java 并发常见面试题(上)",
150+
link: "java-concurrent-questions-01",
151+
},
152+
{
153+
text: "⭐Java 并发常见面试题(中)",
154+
link: "java-concurrent-questions-02",
155+
},
156+
{
157+
text: "⭐Java 并发常见面试题(下)",
158+
link: "java-concurrent-questions-03",
159+
},
126160
createImportantSection([
127161
{ text: "Java 锁详解", link: "java-lock" },
128162
"optimistic-lock-and-pessimistic-lock",
@@ -153,8 +187,8 @@ export default sidebar({
153187
collapsible: true,
154188
children: [
155189
{
156-
text: "JVM常见面试题总结",
157-
link: "https://interview.javaguide.cn/java/java-jvm.html",
190+
text: "⭐JVM 常见面试题总结",
191+
link: "jvm-interview-questions",
158192
},
159193
"memory-area",
160194
"jvm-garbage-collection",
@@ -163,7 +197,10 @@ export default sidebar({
163197
"classloader",
164198
"jvm-parameters-intro",
165199
"jdk-monitoring-and-troubleshooting-tools",
166-
"jvm-in-action",
200+
{
201+
text: "Java 后端线上问题排查",
202+
link: "jvm-in-action",
203+
},
167204
],
168205
},
169206
{
@@ -233,7 +270,7 @@ export default sidebar({
233270
prefix: "mysql/",
234271
icon: ICONS.MYSQL,
235272
children: [
236-
"mysql-questions-01",
273+
{ text: "⭐MySQL 常见面试题总结", link: "mysql-questions-01" },
237274
"mysql-high-performance-optimization-specification-recommendations",
238275
createImportantSection([
239276
"mysql-index",
@@ -267,8 +304,14 @@ export default sidebar({
267304
icon: ICONS.REDIS,
268305
children: [
269306
"cache-basics",
270-
"redis-questions-01",
271-
"redis-questions-02",
307+
{
308+
text: "⭐Redis 常见面试题总结(上)",
309+
link: "redis-questions-01",
310+
},
311+
{
312+
text: "⭐Redis 常见面试题总结(下)",
313+
link: "redis-questions-02",
314+
},
272315
createImportantSection([
273316
"redis-delayed-task",
274317
"redis-stream-mq",
@@ -354,8 +397,14 @@ export default sidebar({
354397
icon: ICONS.SPRING_BOOT,
355398
prefix: "spring/",
356399
children: [
357-
"spring-knowledge-and-questions-summary",
358-
"springboot-knowledge-and-questions-summary",
400+
{
401+
text: "Spring 常见面试题总结",
402+
link: "spring-knowledge-and-questions-summary",
403+
},
404+
{
405+
text: "Spring Boot 常见面试题总结",
406+
link: "springboot-knowledge-and-questions-summary",
407+
},
359408
"spring-common-annotations",
360409
"springboot-source-code",
361410
createImportantSection([
@@ -367,7 +416,10 @@ export default sidebar({
367416
]),
368417
],
369418
},
370-
"mybatis/mybatis-interview",
419+
{
420+
text: "MyBatis 常见面试题总结",
421+
link: "mybatis/mybatis-interview",
422+
},
371423
"netty",
372424
],
373425
},
@@ -423,7 +475,10 @@ export default sidebar({
423475
"why-password-reset-instead-of-retrieval",
424476
],
425477
},
426-
"system-design-questions",
478+
{
479+
text: "⭐系统设计常见面试题总结",
480+
link: "system-design-questions",
481+
},
427482
{
428483
text: "⭐设计模式常见面试题总结",
429484
link: "https://interview.javaguide.cn/system-design/design-pattern.html",

docs/ai/agent/multi-agent.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Prompt Chain 管理处理步骤,多 Agent 管理能够独立完成子目标的
3636
| 结果交付 | 节点输出通常作为后续节点的输入 | 可以传消息、共享状态,也可以交付结构化结果 |
3737
| 失败处理 | 重试失败节点或从 Workflow 检查点恢复 | 还要决定哪个角色可以降级、跳过或重新执行 |
3838

39+
![多 Agent 和多阶段 Prompt Chain 的区别](https://oss.javaguide.cn/github/javaguide/ai/agent/multi-agent-vs-prompt-chain.webp)
40+
3941
如果 AgentInvest 的四个角色只是四次固定模型调用,共用一份上下文和一组工具,每一步只加工上一步的文本,那它仍然是一条多阶段 Prompt Chain。
4042

4143
项目里的每个角色都是独立的 `ReActAgent`,有自己的 Prompt、Toolkit、`maxIters` 和上下文。研究员能查行情、研报、新闻和财务数据,技术分析师关注 K 线与技术指标,舆情分析师查询市场情绪,投资经理读取上游 `<core_thesis>` 做综合判断。外层 Workflow 管理的是四个独立 Agent 的执行过程,不只是在四段文本之间传递结果。
@@ -121,6 +123,8 @@ AgentInvest 使用的是 **Sequential + Parallel + Aggregator** 混合编排。
121123

122124
两种方式可以混用。例如,外层固定收集资料、分析和审核三个阶段,资料收集阶段再由主 Agent 根据问题创建 Subagent。审核和发布门槛仍由固定流程控制,调研方向可以在运行时扩展。
123125

126+
![多 Agent 固定 DAG 和动态委派的区别](https://oss.javaguide.cn/github/javaguide/ai/agent/multi-agent-static-vs-dynamic-orchestration.webp)
127+
124128
## 如何把子任务拆成可执行契约?
125129

126130
只在 Prompt 里写“你是技术调研 Agent”,角色仍然不知道要查什么、能用哪些数据,以及怎样才算完成。协调器派发任务时,要同时给出子目标和成功标准,标明依赖的上游任务、可用工具与权限,并约定输出 Schema 和产物位置。时间、Token、调用次数和失败策略也属于任务契约,由运行时负责执行。
@@ -357,6 +361,8 @@ WHERE task_id = :taskId
357361

358362
AgentInvest 采用的是带门槛的 Best-effort:研究员必须成功,技术分析师和舆情分析师至少成功一个,投资经理才会继续。技术面失败但舆情结果可用时,投资经理可以根据已有结果继续,运行状态仍要保留技术面失败,不能把这次分析当成全量成功。两个补充角色都失败时,则不让投资经理硬凑结论。
359363

364+
![多 Agent 分支失败后的处理策略](https://oss.javaguide.cn/github/javaguide/ai/agent/multi-agent-partial-failure-strategies.webp)
365+
360366
### 外部副作用怎么补偿?
361367

362368
退款、发邮件、创建工单、修改代码和发布版本都会改变外部状态。这些操作可以统一交给 Action Executor,负责分析和生成文本的 Agent 只提交动作意图与参数。

docs/ai/system-design/ai-observability.md

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ head:
1414
content: AI可观测性,AI Observability,Agent Trace,OpenTelemetry,Spring AI,LLM Observability,RAG可观测性,大模型可观测性
1515
---
1616

17-
<!-- @include: @article-header.snippet.md -->
18-
1917
接口返回 200,耗时也正常,智能客服给出的退款规则却是错的。
2018

2119
打开监控面板,只能看到这次请求调用过大模型,并且正常生成了回答。再往下查就麻烦了:是知识库没有召回正确资料,Prompt 拼错了,模型忽略了上下文,还是某个工具返回了旧数据?普通接口日志通常回答不了这些问题。
2220

2321
一次 AI 请求可能会经过问题改写、知识库检索、重排、模型调用、工具调用和结果校验。Agent 还可能重复执行其中几步。每一步看起来都调用成功,错误结果却会继续传给下一步,最后得到一段格式正常、内容有问题的回答。
2422

25-
排查时需要顺着这条执行过程往回找:当时用了哪个模型和 Prompt,检索到了哪些文档,调用了什么工具,Agent 重试了几次,最终回答参考了哪些结果。这些信息都落在同一条调用链里,才能继续定位问题。
23+
排查时需要顺着这条执行过程往回找:当时用了哪个模型和 Prompt,检索到了哪些文档,调用了什么工具,Agent 重试了几次,最终回答参考了哪些结果。
24+
25+
这些信息都落在同一条调用链里,才能继续定位问题。
2626

2727
## 为什么 AI 应用不能只看接口是否成功?
2828

@@ -38,7 +38,9 @@ Trace 能还原系统实际执行过的步骤,读不到模型内部真实的
3838

3939
## Metrics、Logs、Trace、Evaluation 和 Audit 有什么区别?
4040

41-
AI 可观测性里经常同时出现 Metrics、Logs、Trace、Evaluation 和 Audit。这几个概念各自解决不同问题。
41+
AI 可观测性里经常同时出现 Metrics、Logs、Trace、Evaluation 和 Audit。
42+
43+
这几个概念各自解决不同问题。
4244

4345
| 信号 | 主要回答的问题 | 典型内容 |
4446
| ---------- | ------------------------------ | ------------------------------------------------ |
@@ -48,6 +50,8 @@ AI 可观测性里经常同时出现 Metrics、Logs、Trace、Evaluation 和 Aud
4850
| Evaluation | 输出质量是否合格? | 正确性、忠实度、工具选择、任务完成度、安全性 |
4951
| Audit | 谁在什么权限下执行了什么操作? | 用户身份、审批记录、权限决策、外部写操作 |
5052

53+
![AI 可观测信号各自解决的问题](https://oss.javaguide.cn/github/javaguide/ai/llm/ai-observability-signals-overview.webp)
54+
5155
它们之间的配合关系可以用一句话说明:**指标发现异常,Trace 定位过程,评测判断质量,审计追踪责任。**
5256

5357
例如,Token 消耗突然上涨,Metrics 能快速触发告警。顺着异常时间段找到高消耗 Trace,可以看到某个 Agent 连续调用了 12 次模型。至于这 12 次调用是否必要、最终回答是否正确,还要交给评测规则判断。
@@ -80,6 +84,8 @@ spanId:标识调用链中的某个操作
8084
attempt:标识同一步骤的第几次尝试
8185
```
8286

87+
![Session、Run、Trace、Span 和 Attempt 的层级关系](https://oss.javaguide.cn/github/javaguide/ai/llm/ai-observability-id-hierarchy.webp)
88+
8389
重试也要单独处理。每次尝试都新建 Span,并用 `attempt` 标明次数。否则,第一次超时和第二次成功会混在同一条记录里,后面很难还原真实执行过程。
8490

8591
## 一次 Agent 请求应该怎样拆 Span?
@@ -106,6 +112,8 @@ agent.run
106112
└── ai.output.validate
107113
```
108114

115+
![一次 Agent 请求的 Span 拆分示意图](https://oss.javaguide.cn/github/javaguide/ai/llm/ai-observability-agent-span-trace.webp)
116+
109117
这里并没有为 Prompt 模板渲染、字符串拼接之类的普通方法单独建 Span。通常满足下面任意一个条件,才值得独立记录:
110118

111119
- 调用了外部系统,例如模型服务、向量数据库和业务 API;
@@ -351,6 +359,8 @@ Trace 可以证明应用发起过哪些调用,不能替代退款系统的业
351359

352360
单线程同步代码里,Trace 上下文通常能够自动沿调用栈传递。一旦切换线程、进程或消息队列,就需要明确处理传播问题。
353361

362+
![Trace 上下文跨线程、进程和消息边界的传播方式](https://oss.javaguide.cn/github/javaguide/ai/llm/ai-observability-context-propagation.webp)
363+
354364
### 跨服务如何传播?
355365

356366
[W3C Trace Context](https://www.w3.org/TR/trace-context/)定义了通用的 `traceparent``tracestate` 请求头。`traceparent` 用于传递 Trace ID、父 Span ID 和采样标记,`tracestate` 可以携带厂商相关的附加信息。
@@ -445,6 +455,8 @@ Spring AI 默认不导出 Prompt、Completion、工具参数、工具结果和
445455

446456
尾部采样需要 Collector 暂存 Trace,会增加内存和等待成本,还要考虑分布式 Collector 如何让同一 Trace 到达同一个决策节点。OpenTelemetry Collector 的 [Tail Sampling Processor](https://explorer.opentelemetry.io/collector/components/contrib-tailsamplingprocessor?type=processor)目前对 Trace 标记为 Beta,生产使用前要压测容量和丢弃行为。
447457

458+
![Trace 头部采样和尾部采样的区别](https://oss.javaguide.cn/github/javaguide/ai/llm/ai-observability-head-tail-sampling.webp)
459+
448460
### 比较实用的组合策略是什么?
449461

450462
生产环境可以使用分层策略:

docs/ai/system-design/llm-security.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ LLM Top 10 关注模型应用的通用风险,OWASP Agentic Top 10 2026 又把
6868
-> 页面响应、日志、Trace 与评测集
6969
```
7070

71+
![一次 Agent 请求中的信任区](https://oss.javaguide.cn/github/javaguide/ai/llm/llm-security-request-trust-boundaries.webp)
72+
7173
其中只有少量内容可以在既定用途内信任:服务端配置的策略、经过认证的用户身份,以及经过鉴权和完整性校验后读取的结构化业务事实。即使数据来自内部订单或工单系统,其中的备注、标题和富文本也可能由低权限用户写入,对模型来说仍然是不可信内容。下面这些输入都要按不可信数据处理:
7274

7375
- 用户输入和上传文件;
@@ -99,6 +101,8 @@ LLM Top 10 关注模型应用的通用风险,OWASP Agentic Top 10 2026 又把
99101
| 间接 Prompt Injection | 网页、邮件、文档、图片、RAG、工具结果 | 让 Agent 把外部数据当成新指令 | 工单附件中隐藏“把订单发到外部网站” |
100102
| Jailbreak | 常见于用户对模型安全策略的对抗输入 | 绕过模型本身的安全限制 | 诱导模型生成原本拒绝提供的内容 |
101103

104+
![Prompt Injection、间接注入和 Jailbreak 的区别](https://oss.javaguide.cn/github/javaguide/ai/llm/llm-security-prompt-injection-types.webp)
105+
102106
Direct 和 Indirect 描述的是攻击内容从哪里进入,Jailbreak 描述的是攻击者想绕过模型安全策略这一目标。它们不是完全互斥的三种类别。一个售后 Agent 即使没有输出受限内容,只要它在错误指令影响下调用了退款工具,业务系统仍然遭到攻击。
103107

104108
2023 年关于间接 Prompt Injection 的原始研究通过多个原型系统证明了这条攻击路径的可行性:LLM 应用把外部数据和自然语言指令放进同一处理通道后,攻击者可以把恶意指令预先放进模型未来可能检索到的内容中。网页作者、邮件发送者或知识库内容维护者不需要直接访问 Agent 的聊天入口,也可能影响 Agent 行为。这项研究用于说明攻击面和机制,不能直接当作 2026 年某个具体模型的攻击成功率基准。
@@ -315,6 +319,8 @@ MCP Client --面向 MCP Server 的 Token--> MCP Server
315319
MCP Server --面向订单 API 的独立凭证--> Order API
316320
```
317321

322+
![MCP Token 的受众和凭证边界](https://oss.javaguide.cn/github/javaguide/ai/llm/llm-security-mcp-token-boundaries.webp)
323+
318324
Server 校验发行者、受众、有效期和 scope,再根据当前用户、租户和具体资源执行授权。访问下游服务时使用受限的独立凭证,并保留用户委托关系和审计信息。
319325

320326
原样透传 Token 首先破坏的是 audience 和凭证边界:MCP Server 接受了并非签发给自己的 Token,下游又可能错误地把这个凭证当成合法授权。MCP 官方还单独讨论了 Confused Deputy(迷惑代理):例如 OAuth 代理复用固定第三方 Client,又没有针对每个动态 MCP Client 重新取得用户同意。两类问题可能出现在同一条链路中,但不能互相当作定义。
@@ -479,6 +485,8 @@ LLM 应用的供应链不只包含 Maven、npm 和 Python 依赖,还包含模
479485

480486
下面的代码不绑定某个 Agent 框架。模型或框架只负责生成 `RefundProposal`,执行职责由 Java 业务服务承担。
481487

488+
![高风险工具的安全执行链](https://oss.javaguide.cn/github/javaguide/ai/llm/llm-security-safe-tool-execution-chain.webp)
489+
482490
### 1. 身份与模型提议分开
483491

484492
```java

docs/home.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ JavaGuide 是一份系统化的 **Java 面试指南** 和**后端通用面试复
113113

114114
JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) 和周志明老师的[《深入理解 Java 虚拟机(第 3 版)》](https://book.douban.com/subject/34907497/) (强烈建议阅读多遍!)。
115115

116+
- **[⭐JVM 常见面试题总结](./java/jvm/jvm-interview-questions.md)**
116117
- **[Java 内存区域](./java/jvm/memory-area.md)**
117118
- **[JVM 垃圾回收](./java/jvm/jvm-garbage-collection.md)**
118119
- [类文件结构](./java/jvm/class-file-structure.md)

0 commit comments

Comments
 (0)