我们要理解技术栈,
首先要理解什么操作系统和应用进程
我们梳理一下全流程
从服务器的角度,梳理一下数据
1.我们有硬件
bios开启引导
cpu
内存
硬盘之类的
2.我们有操作系统
centos7
乌邦图
3.我们有应用软件:
本体也就是文件夹
文件夹里面有启动类
可以让exe
4.我们的技术栈
就是作用于这个文件夹
所代表的可执行的文件的内部机制
就是控制数据流转
控制数据存放的位置,
是硬盘,还是内存
5.理解技术栈配置到工程,代码文件夹需要做的事情
第一层:硬件 → 操作系统(地基与管家)
- BIOS/UEFI:通电后初始化硬件,将引导权交给硬盘上的引导加载程序(GRUB)。
- 内核(Kernel):CentOS/Ubuntu 加载内核,接管CPU(调度)、内存(虚拟地址空间)、硬盘(文件系统)。
- 关键转变:此时硬盘上的二进制文件(如
.exe/Linux ELF)只是“静止的字节”,操作系统尚未将其视为“应用”。
第二层:操作系统 → 应用进程(赋予生命)
当你在终端执行 ./start.sh 或 java -jar app.jar 时:
- 进程创建:内核将可执行文件加载到内存,分配 PCB(进程控制块) 和独立的虚拟内存空间(栈、堆、代码段、数据段)。
- 运行时依赖:如果依赖动态链接库(如
.so/.dll),操作系统会将其映射到进程内存中。 - 此时此刻:你的“应用文件夹”已经从硬盘上的静态目录,变成了内存中正在运转的进程。
第三层:技术栈的内部机制(数据流转与存放)
你的技术栈(如 Java/Spring、Go、Python/Flask、Node.js)本质上是运行在该进程内存中的指令集合。它的核心工作就是回答四个问题:
| 问题 | 技术栈的机制 | 数据存放位置 |
|---|---|---|
| 代码逻辑放哪? | 方法区/代码段(只读指令) | 内存(加载进内存的字节码/机器码) |
| 临时运算放哪? | 线程栈(局部变量)、CPU寄存器 | 内存(高速缓存/寄存器) |
| 全局对象放哪? | 堆(Heap)——由垃圾回收(GC)或手动管理 | 内存(动态分配) |
| 持久化放哪? | 通过 IO 流、数据库驱动、文件系统 API 写入 | 硬盘(磁盘文件/数据库数据文件) |
你的理解完全正确:技术栈就是在内存和硬盘之间做“搬运工”和“调度员”,通过内存缓存(Redis/本地Cache)提速,通过日志框架(Logback)将内存日志刷到硬盘。
第四层:配置技术栈到“工程/代码文件夹”时,到底要做什么?
你现在知道了运行时数据流,那么回到编码阶段,配置技术栈就是给这套运行时机制提前写好“运行说明书”。在工程文件夹里,你必须完成以下 4 件具体的事:
1. 定义“启动入口”(告诉操作系统谁来当爸爸)
- 必须指定 Main-Class(Java)或
main函数所在文件(Go/Python)。 - 工程配置:在
pom.xml(Maven)或build.gradle里配置mainClass,或者在打包插件中指定。 - 对应机制:操作系统加载进程时,内核需要知道第一条指令地址。
2. 声明“内存边界”(告诉 JVM/进程用多少内存)
- 必须显式设置堆大小、栈大小、元空间。
- 工程配置:写在
Dockerfile的ENV JAVA_OPTS="-Xmx2G -Xms2G",或写入start.sh启动脚本。 - 对应机制:限制堆内存上限,防止 OOM(内存溢出)被操作系统内核杀掉。
3. 管理“第三方依赖”(解决数据流转中的工具箱)
- 技术栈依赖大量 jar/pip/node_modules 包,运行时需要找到它们。
- 工程配置:使用
Maven/Gradle(Java)、requirements.txt(Python)、package.json(Node)声明依赖,并用 类加载器(ClassLoader) 配置加载顺序(如classpath)。 - 对应机制:运行时,JVM 依据
classpath从硬盘加载.class文件到内存。
4. 配置“数据流向的地图”(读写哪里)
这是最体现“控制数据存硬盘还是内存”的地方,必须写清楚:
- 配置文件(
application.yml/.env):- 连接池(HikariCP)配置:最大连接数(内存占用)、超时时间。
- 日志配置(
logback.xml):日志级别(决定内存中过滤哪些)、滚动策略(何时刷入硬盘)。 - 缓存配置(Caffeine/Redis):缓存最大条目数(防内存爆)、过期时间(定时刷盘)。
- 对应机制:技术栈启动时会解析这些配置文件,将参数注入到连接池、缓存管理器、日志写入器的内存对象中。
给你的终极落地总结(从“文件夹”到“运行”)
在你写代码的工程文件夹中,配置技术栈不是为了写业务逻辑,而是为了告诉底层三件事:
| 你要做的事 | 在工程文件夹里的具体动作 |
|---|---|
| 定入口 | 指定 main 类,构建成可执行 Jar/Binary。 |
| 限资源 | 在启动脚本/Docker 里配置 Xmx、ulimit、NODE_OPTIONS。 |
| 绑依赖 | 锁定 pom.xml/go.mod 版本,确保硬盘上的依赖库能被类加载器找到。 |
| 画地图 | 写 application.yml,定义 哪类数据进内存(缓存)、哪类数据落硬盘(数据库连接/日志路径)、数据如何序列化传输(JSON/Proto)。 |
一句话帮你刻进脑子:
操作系统管“进程活不活”(CPU/内存分配),技术栈管“数据怎么流”(内存计算与硬盘持久化)。你在工程文件夹里配置的每一个参数,本质上都是在给这套“数据流引擎”拧螺丝——拧得太松(内存太小)会崩,拧得太紧(缓存太大)会卡,拧对位置,数据才能按你预想的路径顺畅流转。

1576

被折叠的 条评论
为什么被折叠?



