配置目录文件
基本信息
| 属性 | 值 |
|---|---|
| 目录 | <游戏目录>/config/spark/ |
| 目录来源 | Forge1710SparkMod.getConfigDirectory() = e.getModConfigurationDirectory().toPath()(Forge1710SparkMod.java:53) |
| 平台共享 | 是 —— 服务端与客户端各自的 SparkPlatform 都绑定同一路径 |
spark 的所有持久化产物都落在 Forge 的 config/spark/ 目录下,不写入世界存档。目录在需要时自动创建(SparkPlatform.resolveSaveFile 中的 Files.createDirectories(pluginFolder))。
目录内容
| 条目 | 类型 | 何时写入 | 来源 |
|---|---|---|---|
config.json |
用户配置 | 平台构造时读;部分键运行期写 | SparkPlatform 构造 |
activity.json |
活动日志 | 每次 profiler / heapdump / heapsummary 完成后 | SparkPlatform 构造 + ActivityLog.addToLog |
tmp/ |
临时目录 | async-profiler 原生库解压时 | TemporaryFiles |
profile-<ts>.sparkprofile |
采样报告 | /spark profiler --save-to-file 或上传失败回退 | resolveSaveFile("profile", "sparkprofile") |
heap-<ts>.hprof / .phd |
堆快照 | /spark heapdump | resolveSaveFile("heap", ...) |
heap-<ts>.hprof.gz |
压缩堆快照 | heapdump 带 --compress gzip |
Compression.GZIP |
heapsummary-<ts>.sparkheap |
堆摘要 | /spark heapsummary --save-to-file 或上传失败回退 | resolveSaveFile("heapsummary", "sparkheap") |
<ts> 统一为 yyyy-MM-dd_HH.mm.ss(SparkPlatform.DATE_TIME_FORMATTER,SparkPlatform.java:95),例如 profile-2026-10-02_14.31.07.sparkprofile。
压缩产物不删除原文件:Compression.GZIP 生成 <name>.gz 后,原 .hprof 仍留在目录中,两份都占空间。
tmp 目录
tmp/ 由 TemporaryFiles 管理,绑定路径为 plugin.getPluginDirectory().resolve("tmp")(SparkPlatform 构造)。
文件名格式为 前缀 + Long.toHexString(System.nanoTime()) + 后缀(TemporaryFiles.create),即实际为 spark-<nanoTime 十六进制>-libasyncProfiler.so.tmp。
三个安全设计:
- 权限收紧:POSIX 系统下创建时带
OWNER_READ, OWNER_WRITE权限 - 双重清理:每个文件
toFile().deleteOnExit()且登记进内部files集合 - 显式删除:
SparkPlatform.disable()调用temporaryFiles.deleteTemporaryFiles()
若 tmp 目录无法就绪,create 回退到 Files.createTempFile(prefix, suffix) 使用系统临时目录(TemporaryFiles.create 的 if/else 分支)。
生命周期
| 时机 | 行为 |
|---|---|
| 平台构造 | 读 config.json;activityLog.load() 载入历史记录 |
平台 enable() |
解压 async-profiler 到 tmp/(若启用) |
| 命令执行 | 写 config.json(部分键)、activity.json、报告文件 |
平台 disable() |
deleteTemporaryFiles() 清空 tmp/ |
平台 disable() 由 Forge1710ServerSparkPlugin.disable() 触发,链路上会 FMLCommonHandler.instance().bus().unregister(this) 注销事件总线(Forge1710ServerSparkPlugin.java:60-63),再由 Forge1710SparkMod.serverStop 置空 activeServerPlugin(Forge1710SparkMod.java:69-73)。
客户端平台没有对应的停止钩子 —— Forge1710SparkMod 只有 serverStop 处理,客户端 SparkPlatform.disable() 无调用点,客户端关闭时 tmp/ 依赖 deleteOnExit 兜底。
数值
| 数值名 | 值 | 来源 |
|---|---|---|
| 目录层级 | <游戏目录>/config/spark/ |
getModConfigurationDirectory() + spark |
| 时间戳格式 | yyyy-MM-dd_HH.mm.ss |
SparkPlatform.DATE_TIME_FORMATTER |
| 活动日志保留期 | 60 天 | Activity.shouldExpire |
| 临时文件权限 | owner read + write(POSIX) | TemporaryFiles.OWNER_ONLY_FILE_PERMISSIONS |
| 压缩类型 | 仅 GZIP(XZ 在源码中被注释) | Compression 枚举 |
相关条目
- config.json 配置项 - 目录内唯一的用户配置文件
- 访问变换器 - 随 jar 打包而非落盘的配置
- /spark heapdump - 堆快照产物的生成与压缩
- 报告输出与查看器 - 上传与存盘的两条路径