自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(208)
  • 收藏
  • 关注

原创 聊聊 GitHub CLI,以及我为什么不再手动配 SSH 了

我现在换电脑之后第一件事就是跑,比以前去网页上找 Developer Settings 生成 token、或者重新配 SSH 密钥省事多了。如果你还没试过,值得花五分钟体验一下。

2026-03-15 23:07:33 391

原创 Linux 服务器磁盘爆满怎么排查和清理

服务器最让人头疼的一类故障,不是服务彻底挂掉,而是“还能跑一点,但哪都不正常”。比如数据库突然报错、日志写不进去、应用重启失败,或者终端里直接出现这类提示。很多人第一反应是数据库坏了、程序炸了,结果折腾半天,最后发现根因非常朴素:磁盘满了。

2026-03-12 18:25:55 577

原创 我把 oh-my-openagent 翻了一遍,终于看懂它为什么不像一个插件,而像一套多 Agent 编排系统

最新Open Code以及他的增强插件相继爆火我把这套东西完整捋了一遍,原本以为这只是一个运行在 OpenCode 上的增强插件,结果越往下看越发现,它的重点根本不在“多装了几个工具”或者“多配了几个 Prompt”,而是在把一个原本偏单线程的 AI 编程入口,改造成一套能自动拆任务、自动选模型、自动续跑、自动调子 Agent 的多 Agent 编排系统。这件事表面上看很像“给 OpenCode 套了一层壳”,但实际上不是。

2026-03-12 18:19:02 5597 1

原创 聊聊JVM里的符号引用、直接引用与动态分派

最后再帮你总结一下。符号引用就是class文件里的"名字版",直接引用是JVM内部可以直接定位的"定位版",解析就是名字到定位这个转换过程。静态绑定是解析后目标就唯一了,动态分派是解析后还得看运行时类型。class文件里只能写名字,类加载后把名字查成真实地址,静态方法查完就定了,重写方法查完还得运行时再挑一个。《深入理解Java虚拟机(第3版)》- 周志明JVM规范文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html。

2026-03-07 13:15:02 414

原创 JVM对象分配:如何在高并发下安全高效地分配内存

栈上分配— JIT优化,逃逸分析,完全无开销TLAB分配— 线程本地缓冲,无锁分配CAS分配— 共享区无锁更新,自旋重试核心思路:先挑最快的路走,不行再逐级降级。

2026-03-07 12:56:24 97

原创 重入锁的进阶之路:从显式计数到三级缓存

说到重入锁,可能很多人第一反应就是"一个线程重复获取同一把锁不会卡死"。但这里面的实现细节,挺有意思的。

2026-03-07 12:02:51 258

原创 AQS的智慧:短暂自旋 + 深度阻塞

CAS乐观尝试——能不动用阻塞就不动无锁入队——快速进入排队系统短暂自旋——给一次捡漏机会最终park——竞争激烈时切到零消耗模式说白了就是一句话:先试试,失败了再等,别一上来就把线程搞休眠。成本从低到高,层层递进,就是AQS性能还行的秘密。

2026-03-07 11:27:50 70

原创 聊聊AQS和Monitor的那些相似与不同

队列含义常见状态等进入synchronizedBLOCKED已拿锁,调用wait()等待条件lock()失败后排队等锁await()后等待条件说白了,它们都是"双队列"的设计思路,但Monitor更底层、更重量级,AQS则提供了更好的封装和扩展性。理解了这个对应关系,再去看ReentrantLock、CountDownLatch这些AQS的实现类,就会清晰很多。本来是想分开整理的,结果写着写着发现它们居然这么像,看来并发编程里很多看似不同的东西,底层逻辑都是相通的。

2026-03-07 11:21:25 510

原创 前沿AI CL : Kilo CLI安装与配置自定义模型

providers这里填什么取决于你想用哪家模型,OpenAI填openai,Claude填anthropic,DeepSeek填deepseek,api_key换成你对应的key就行。今天说下Kilo CLI这个工具,个人感觉挺香的——基于最近爆火的OpenCode,OpenCode有的功能他都有同时又兼具了kilo自己的Orchestrator功能。运行一次之后,去用户目录下的.config/kilo文件夹看看,会自动生成好的。就能看到你刚才加的模型了。挺简单的,感兴趣的可以试试。

2026-03-03 00:09:49 1339

原创 聊聊 Git Worktree这个容易被忽略的功能

worktree这个功能其实不复杂,核心就是让你能同时开多个目录并行工作。但很多人不知道,用起来确实方便。如果你经常切分支切到烦,可以试试这个。

2026-03-02 23:21:49 253

原创 Spring Boot项目中Maven编译参数source、target与release的区别及配置实践

在Spring Boot项目开发中,将本地代码打包部署到服务器时,常会遇到或等异常。排查pom.xml文件,往往会涉及以及Maven编译插件的source和target属性。本文将直观解析这些配置的区别,并提供标准的配置方案。

2026-02-24 13:37:57 516

原创 开发者环境配置最佳实践:用 Docker 部署 Open WebUI,打造私人 ChatGPT

咱们之前把 Ollama 和大模型都搞定了,但天天在那个黑乎乎的命令行里跟 AI 聊天,总觉得差点意思,连个图片都发不了,代码高亮也一般。这篇文章就通过一个入门案例来为大家打开关于ai的大门为理解后续博主推出的关于ai的反代,key负载降级逻辑等等前沿工具做铺垫。

2026-02-22 18:16:52 187

原创 开发者环境配置:用 Ollama 实现本地大模型部署(附下载慢的解决方案

这一篇,咱们聊聊怎么装 Ollama,并把那些动辄几个 G 的模型文件彻底安顿在 D 盘。

2026-02-22 17:58:00 1818

原创 开发者环境配置最佳实践:用 Docker Desktop 彻底解决环境服务配置管理

如果你还在 Windows 上手动下载 MySQL 的安装包,或者为了学个 Redis 折腾半天系统服务,那这篇文章你一定要看到底。作为独立开发者,电脑里最不该有的就是一堆乱七八糟的后台服务。今天咱们的主角是 Docker Desktop,它是目前 Windows 开发中管理容器化服务的终极工具。

2026-02-22 17:46:00 420

原创 开发者环境配置最佳实践:用 mise 一个工具管好 Java、Node 和 Python等开发环境

到这一步,咱们现在有了编辑器,有了语言环境,接下来,就可以聊聊怎么把 Docker 数据库和大模型给安顿好。

2026-02-22 17:38:31 1437

原创 开发者环境配置最佳实践:编辑器Cursor ,VS Code的上位体验实现 AI 与 WSL 联动

配置完我们的编辑器,下一篇咱们聊聊怎么把wsl中的开发环境轻松配置和管理。

2026-02-22 17:33:49 741

原创 开发者环境配置最佳实践:极致性能利用 WSL2 安装配置全指南

把地基打好了,后面装 mise、Java 和 Docker 才会顺理成章。下一篇我会教大家怎么在这个环境下,用现代化的方式一键配齐所有开发语言环境。

2026-02-22 17:22:30 949

原创 开发者环境配置最佳实践:用 Scoop 给 C 盘减负

到这一步,你的 D 盘developer目录下已经有了一个非常完整的工具库。你会发现,虽然装了一堆东西,但你的 C 盘空间几乎没有变动。

2026-02-22 17:08:18 343

原创 开发者配置最佳实践:用 PowerShell 7 打通环境配置的第一关

拿到新电脑,大家第一反应可能还是习惯性地 Win + R 然后敲个 cmd 进去。但作为一个打算深耕技术的开发者,我建议你从这一刻起彻底忘掉 cmd,把 PowerShell 7 当成你的唯一入口。

2026-02-22 17:01:22 342

原创 【极客实战】抛弃本地客户端!打造你的随身云端运维工作台”(All-in-One Web Terminal)

为了数据安全,我们绝不能使用 HTTP 明文传输。Web 环境相比本地客户端,最大的劣势是容易受网络波动影响。为了防止网络波动导致的ssh断连脚本白跑的情况出现,我们选择了。密钥只在浏览器本地加密存储,不在服务端保存,兼顾了便捷与安全。本文将教你利用 Docker + Nginx,在你的服务器上搭建一套。它可以把你的终端进程挂在服务器后台,无论浏览器怎么关,进程永远在跑。既然浏览器是所有设备都有的软件,为什么不把。为了保证系统的稳定性和专业性,我们采用。实现了ssh的保活。

2025-11-29 18:32:01 507

原创 从入门到专家:远程桌面访问内网Windows主机的多层次解决方案与深度实践指南

远程访问内网主机是IT领域的经典需求。在开始深入技术细节前,了解不同方案的优劣至关重要。我们将探讨三种主流方法,您可以根据自身需求、技术能力和环境限制,选择最适合的路径。此方案通过云端服务器作为中继,由被控端和控制端主动发起连接,从而穿透NAT。这是最直接、配置最少的方法。在云服务商的控制台,配置网络安全组(Security Group)。输入中继服务器的登录凭据。添加入站规则,允许以下TCP端口的流量,源地址设置为。执行以下SSH命令以建立持久化的反向隧道。参数表示不执行远程命令,),使其可被公网访问。

2025-11-09 21:14:17 976

原创 Git的设计哲学:为何选择快照,而非增量

当需要获取项目中某个文件的历史版本时,系统必须从该文件的第一个完整副本开始,然后依次应用后续所有的补丁,直到目标版本。这个操作的耗时,与项目的历史长度无关,从而保证了即使在非常庞大的项目中,版本切换和历史追溯也能快如闪电。对于内容没有发生任何变化的文件,Git不会存储新的数据,而是在新的快-照中,直接重用上一个版本中对应文件的内容指针。在版本控制系统的设计中,如何记录历史变更,是一个根本性的选择。它的核心思想是,每一次提交,都记录下整个项目在那个时间点的完整状态,就像为项目拍下了一张内容齐全的照片。

2025-10-31 18:18:24 419

原创 在 Ubuntu 上使用 Docker 部署思源笔记:一份详尽的实践教程以及常见错误汇总

如果您在访问时遇到问题,或者想了解我们是如何从失败的尝试中得到上面那条最终命令的,这部分内容至关重要。对于已经熟悉 Docker 的朋友,可以直接使用下面这行最终的、正确的命令来启动思源笔记。最简单直接的方法就是删除旧容器,用一个您百分百确定的密码重新创建一个。,说明容器启动后异常退出了,服务自然无法访问。这说明容器启动失败了,我们需要查看日志来找出失败的原因。,说明容器正在运行,问题很可能出在网络防火墙上。修改密码需要重建容器,因为密码是在启动时传入的。,输入您设置的密码,即可开始使用。

2025-10-28 11:31:25 1707

原创 ZSet 与实时排行榜:从应用到原理的深度解析

在面试中或实际设计时,我们可以这样阐述:对于实时排行榜,首选 Redis ZSet。它完美契合了动态排序、快速更新和高效查询的需求。相比 MySQL,它避免了高并发写入时的磁盘I/O瓶颈。ZSet 的高效得益于其底层的复合数据结构:一个哈希表和一个跳表。哈希表负责 O(1) 的成员分数查找;跳表负责 O(log N) 的排序、更新和范围查询。而 ZSet 实现 O(log N) 排名查询(ZRANK)的精髓,在于它跳表指针上的span(跨度)属性。这个属性记录了指针跳跃的距离。

2025-10-27 18:48:05 446 1

原创 深入理解JVM的安全点与安全区域

安全点和安全区域是JVM为实现STW而设计的两个互补的协作机制,共同确保所有应用线程都能在一个一致的状态下暂停。安全点主要面向正在CPU上活跃执行的线程。它通过JIT在代码中插入轮询点,让这些活跃线程主动在预设的安全位置上自我挂起。安全区域则解决了处于非活动状态的线程的协同问题,例如那些被阻塞、等待或正在执行本地代码的线程。通过标记进入和检查离开的机制,安全区域确保了JVM在STW时可以不必等待它们,同时也保证了它们在恢复运行时不会破坏内存一致性。

2025-10-27 18:35:13 472

原创 关于JVM调优,我想聊聊数据和耐心

当然,最关键的,是摸清楚高峰期所有存活对象的总体积大概有多少,这是你设置堆大小的根本依据。这份“基线数据”非常重要,它是你后续所有调优工作的“参照物”,没有它,你根本不知道你的修改到底是优化了还是劣化了。正确的做法是,建立一个明确的假设,比如:“我发现Full GC太频繁了,我怀疑是新生代太小导致对象过早进入了老年代。” 然后,用和基线测试完全一样的压力,重新跑一次,收集新数据。所以你看,JVM调优其实是个很严谨的工程活动,它考察的是你的分析能力、逻辑推理和严谨的工程素养,而不是你背了多少启动参数。

2025-10-27 18:32:33 343

原创 分享一个自用的AI Coding Prompt

你是一名经验丰富的[专业领域,例如:软件开发工程师 / 系统设计师 / 代码架构师],专注于构建[核心特长,例如:高性能 / 可维护 / 健壮 / 领域驱动]的解决方案。重点关注[项目类型,例如:代码质量优化 / 架构重构 / 功能增强 / 用户体验提升 / 性能调优 / 可维护性改善 / Bug修复]的具体实现细节。仅实现当前明确所需的功能,抵制过度设计和不必要的未来特性预留。详细说明你的改进方案,并将其拆解为逻辑清晰、可操作的步骤。追求代码和设计的极致简洁与直观,避免不必要的复杂性。

2025-10-27 18:12:45 577

原创 深入AQS源码:解密Condition的await与signal

节点入队后,线程就从“等待条件”的状态,转变成了“等待获取锁”的状态,并通过。这会进入AQS标准的获取锁流程,线程会和其他所有正在排队获取锁的线程一样,在同步队列中竞争,直到成功获取之前保存的。的实现精髓在于它维护了两个队列:一个用于等待条件的条件队列,一个用于竞争锁的同步队列。,这个方法负责将等待的线程节点从条件队列转移到同步队列,这是整个唤醒机制的关键。这个方法会彻底释放当前线程持有的锁,无论重入了多少次,并将原始的同步状态。方法会先检查当前线程是否持有锁,然后获取条件队列的头节点,并调用。

2025-09-20 16:14:04 467

原创 深入剖析“惊群效应”:从Java的notifyAll到epoll的解决方案

所谓“惊群效应”,简单来说,就是当有很多个线程或者进程在等待同一个事件的时候,事件发生了,结果所有等待的线程都被系统同时唤醒。这就导致了,除了那个最终抢到任务的“幸运儿”,其他所有被唤醒的线程都白忙活了一场,它们醒来后发现没事可干,又得重新回去睡觉。另一方面,所有被唤醒的线程,通常会立刻去争抢同一个资源,比如一个锁,这会在瞬间造成激烈的锁竞争,可能导致系统性能出现抖动。实例上的事件,当事件发生时,内核会足够智能,它通常只会唤醒其中的一个线程去处理,从根源上避免了惊群的发生。方法,它就像一个更精准的通知器。

2025-09-20 16:11:18 425

原创 彻底搞懂Nginx的I/O模型:为什么它能用少量进程处理百万并发?

其实答案就藏在它的I/O模型里,这个模型的设计思路,跟我们常见的Java服务器有很大的不同。但也就到此为止了,它自己从不处理连接上的具体数据,而是把这个已经建立好的连接,转手交给手下的。进程因为代码缺陷或者恶意攻击而崩溃了,那也只是这一个进程挂掉,它所处理的那部分连接会断掉,但其他的。总的来说,Nginx的高性能并非来自某个单一的技术点,而是源于它整个架构设计的智慧。的多进程模式,在顶层实现了管理与工作的分离,保证了极高的稳定性和安全性。进程,哪个不小心挂了,就立刻再拉起一个新的来,保证服务的持续运行。

2025-09-16 18:53:35 496

原创 解密Tomcat的I/O模型:非阻塞之上,为何要兼容阻塞?

总而言之,Tomcat的架构是一种务实而精巧的工程妥协,它用“分工隔离”的策略,在非阻塞的底层之上,为我们搭建了一个同步、易用的应用舞台。一旦发现“敌情”,它自己并不会去读数据,而是做了一次“二次分发”:把这个“可读事件”封装成一个任务,直接扔给了一个完全独立的、庞大的。线程组合在一起,逻辑上扮演了一个统一的“调度部门”角色,这个部门的唯一职责就是“侦测”和“分发”事件,它自己不干活。这种模式将硬件性能压榨到了极致,可以用极少的线程支撑极高的并发连接,但代价是编程模型更复杂,对开发者的心智负担也更重。

2025-09-16 18:42:35 657

原创 深入对比Tomcat与Netty:HTTP请求从网卡到Controller的全链路追踪

一个HTTP请求到底是怎么从用户的浏览器,穿过层层网络,最终抵达我们代码里的Controller方法的?两者没有绝对的优劣,理解它们背后的设计思想,才能在合适的场景做出正确的选择。读完后,它把字节流解析成我们熟悉的。的,比如微服务网关、消息推送中台,需要用有限的服务器资源应对海量的并发连接,那么Netty/WebFlux是更好的选择,它能最大化系统吞吐能力。线程也只有少数几个,它像个雷达,不断扫描所有已连接的通道,看看哪个通道上送来了数据。,通常就一个线程,工作很专一,只管接收连接,然后把连接转手扔给。

2025-09-16 18:40:09 736

原创 Java内部类内存泄漏解析:`this$0`引用的隐秘风险

Java的非静态内部类,由于其一种隐蔽的编译期机制,是导致内存泄漏的常见原因之一。这个问题通常难以在开发和测试阶段发现,但在生产环境中可能导致严重的性能问题甚至内存溢出(OOM)。本文将从底层机制出发,详细解析这一风险的根源,并提供明确的规避原则。

2025-09-14 16:13:55 478 1

原创 避开Java日期格式化陷阱:`yyyy`与`YYYY`的正确使用

yyyy。

2025-09-14 15:07:42 1299

原创 UTF-8与UTF-16命名揭秘:数字8和16的真实含义

编码方案名称数字含义编码单元 (Code Unit) 大小字符最终表示形式UTF-888位 (1字节)由1至4个8位单元组成UTF-161616位 (2字节)由1至2个16位单元组成。

2025-09-14 15:00:47 672

原创 实战Prometheus与grafana mcp:构建智能化系统监控可观测体系

说到底,传统的Prometheus+Grafana监控是“基建”,它解决了数据从无到有的问题。而AI+MCP的玩法,则是“效率革命”,它改变了我们和数据交互的方式,从“自己动手”变成了“张嘴就来”。这只是AI在软件工程里提效的一个小例子。以后从写代码、Code Review到智能运维,AI会越来越多地成为我们的“超级辅助”。早点把这些新工具玩起来,绝对不亏。

2025-09-12 16:34:23 1122

原创 Docker Engine Stop?大概率是内存不够了,这么排查就行

总而言之,下次再碰到 “Engine Stopped”,别慌。先看内存!先看内存!先看内存!十次里有八次都是内存问题。如果不是,再按顺序试试重启软件、重启电脑、重启WSL。这几招下来,基本都能搞定。

2025-09-12 16:22:10 1141

原创 实战ELK与AI MCP:构建高可用的智能化日志可观测体系

通过本文的实践,我们成功构建了一套基于ELK的分布式日志解决方案,实现了日志的集中管理和高效查询。更进一步,我们探索了如何利用AI MCP将大语言模型的能力赋予系统可观测性,从传统的“手动检索”升级为“智能分析”,这无疑为我们日后的系统维护和故障排查工作提供了强大的助力。随着技术的发展,AI与运维(AIOps)的结合将越来越紧密,值得我们持续关注和学习。

2025-09-12 15:42:16 1619

原创 新服务器初始化:Git全局配置与SSH密钥生成

它能实现权限的最小化和隔离:即使服务器的密钥不慎泄露,也只需在代码托管平台禁用此密钥即可,不会影响到您个人的访问权限。在初始化一台新服务器或重装系统后,除了基础的环境配置,为服务器设定清晰的身份标识并建立与代码托管平台的安全通信是至关重要的一步。完成以上步骤后,您的新服务器便拥有了合法的Git提交身份,并建立了与远程代码仓库的安全连接。这是一个标准且必要的初始化流程,为后续的代码拉取、自动化部署和其他开发运维工作奠定了坚实的基础。开头、以您的邮箱结尾的字符,这就是需要复制的公-钥。替换为您自己的信息。

2025-09-06 18:25:47 813

原创 WSL2环境下因服务器重装引发的SSH连接问题排查记录

这是非常关键的一步。由于Windows和Linux的文件权限系统不同,直接链接后可能导致权限过于开放,SSH会因此拒绝使用这些密钥。近期在重装一台云服务器后,我尝试从本地的WSL2环境通过SSH连接,遇到了连接失败的问题。由于我重装了服务器系统,服务器端的SSH服务重新生成了一对主机密钥,导致其指纹发生了变化。完成配置后,WSL2中的所有SSH相关命令将默认使用Windows目录下的密钥和配置,实现了两个环境身份的统一,简化了后续操作。该命令会精确地移除指定IP地址的旧记录,而不影响文件中其他主机的条目。

2025-09-06 18:20:57 1042

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除