Files
kenaito-kopsc/README.java.md
T
odboy f62c1f4872 feat: 新增 java run,按 JDK 版本自动套用调优参数运行 Java 应用
- 自动识别 JDK 8/11/17/21 与宿主机 CPU、可用内存;容器内以 cgroup
  限额为准;堆默认取可用内存 50%,-Xms 与 -Xmx 同值
- 按版本分支生成参数:JDK 8 用 -Xloggc 一组,JDK 9+ 用 -Xlog:;
  堆超过 30g 时自动省略压缩指针参数
- 支持 --jdk/--java/--heap/--xms/--env/--gc-log/--heap-dump-on-oom/
  --print-flags/--dry-run;jar 之后的参数原样交给应用
- 前台运行:stdio 直连、退出码透传、SIGINT/SIGTERM 转发给 JVM
- BuiltinRequest 增加 Stdin,使内置命令可以读取调用方输入
- 修正帮助中的用法行重复(自定义 Usage 不再追加通用透传尾巴)
- 文档:新增 README.java.md,主 README 补充导航与示例
2026-11-01 09:16:19 +08:00

79 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Java 应用(`kopsc java <子命令>`)
> 返回 [README.md](README.md)
按 JDK 版本自动套用调优参数并前台运行 Java 应用。你不需要逐条抄 JVM 参数,
kopsc 会根据宿主机(或容器)的实际资源算出堆大小,并按 JDK 版本选择对应的 GC 日志写法。
```bash
kopsc java run app.jar # 一键启动,参数自动生成
kopsc java run app.jar -- --spring.profiles.active=prod # 应用参数写在 jar 之后
kopsc java run --jdk 17 --print-flags app.jar # 只打印最终 java 命令行
```
## 运行应用(java.run)
`kopsc java run <app.jar> [-- 应用参数...]` 等价于用一组业界常用参数执行
`java <flags> -jar <app.jar> <应用参数>`,并在前台运行:日志直接打印到终端,Ctrl+C 可停止,
退出码原样返回给调用方。
```bash
kopsc java run myapp.jar
kopsc java run myapp.jar -- --server.port=9000 --spring.profiles.active=prod
kopsc java run --jdk 11 --heap 4g myapp.jar
kopsc java run --env staging --gc-log /var/log/app myapp.jar
kopsc java run --dry-run myapp.jar # 只看将执行的命令,不启动
```
### 自动识别的内容
| 项目 | 规则 |
| --- | --- |
| JDK 版本 | 执行 `java -version` 解析版本,识别不到时回退 `-XshowSettings:properties`;支持 **8 / 11 / 17 / 21**,其它版本会提示用 `--jdk` 指定 |
| CPU 核数 | 取可用逻辑核数;容器内优先采用 cgroup 配额(`cpu.max` / `cfs_quota_us`) |
| 内存 | Linux 读 `/proc/meminfo`(容器内以 cgroup `memory.max` / `memory.limit_in_bytes` 为准)、macOS 用 `sysctl hw.memsize`、Windows 用 `wmic` |
| 堆大小 | 默认取可用内存的 **50%**,`-Xms` 与 `-Xmx` 同值;可用 `--heap` / `--xms` 覆盖 |
| 直接内存 | `-XX:MaxDirectMemorySize` 取堆的 1/4,最低 64m |
| 配置环境 | `-Dconfig.file=application-<env>.yaml`,来源依次为 `--env`、环境变量 `APP_ENV`、默认 `prod` |
### 生成的参数
| 类别 | 参数 |
| --- | --- |
| 通用 | `-server`、`-Xss256k`、`-XX:+SegmentedCodeCache`、`-XX:+ExplicitGCInvokesConcurrent`、`-Djava.security.egd=file:/dev/./urandom` |
| 堆 | `-Xmx<size>`、`-Xms<size>`、`-XX:MaxDirectMemorySize=<size>` |
| 压缩指针 | `-XX:+UseCompressedOops`、`-XX:+UseCompressedClassPointers`;**堆超过 30g 时自动省略** |
| GC | `-XX:+UseG1GC` |
| GC 日志(JDK 9+) | `-Xlog:gc*,safepoint:<dir>/gc.log:time,uptime:filecount=100,filesize=50M` |
| GC 日志(JDK 8) | `-verbose:gc`、`-Xloggc:<dir>/gc.log`、`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`、`-XX:+UseGCLogFileRotation`、`-XX:NumberOfGCLogFiles=100`、`-XX:GCLogFileSize=50M` |
| 命令回显 | `-XX:+PrintCommandLineFlags` |
| 可选 | `-XX:+HeapDumpOnOutOfMemoryError`(`--heap-dump-on-oom`) |
> **JDK 8 与 9+ 的 GC 日志写法不兼容**:`-Xlog:` 是 JDK 9 引入的,JDK 8 用它会导致 JVM 直接拒绝启动。
> kopsc 按检测到的版本自动切换,所以同一份启动命令在 JDK 8 和 JDK 21 上都能跑。
### 选项
| 选项 | 说明 |
| --- | --- |
| `<app.jar>` | 应用 jar,必填 |
| `-- <应用参数>...` | 交给应用自身的参数;写在 jar 之后的所有内容也会原样传给应用 |
| `--jdk <8\|11\|17\|21>` | 指定按哪个 JDK 版本的方案生成参数;可写 `1.8`、`jdk17` |
| `--java <路径>` | 指定使用的 java 可执行文件,默认取 PATH 中的 `java` |
| `--heap <大小>` / `--xmx <大小>` | 指定堆上限,如 `4g`、`512m`;默认取可用内存 50% |
| `--xms <大小>` | 指定初始堆,默认与堆上限相同 |
| `--env <环境>` | 指定配置环境,生成 `-Dconfig.file=application-<环境>.yaml` |
| `--gc-log <目录>` | 开启 GC 日志并指定输出目录;默认不开启 |
| `--heap-dump-on-oom` | OOM 时导出堆转储 |
| `--print-flags` | 只打印最终 java 命令行(一行),可直接复制到 Dockerfile / systemd |
| `-q`, `--quiet` | 不打印启动摘要 |
| `--dry-run` | 只展示将执行的命令与资源判定,不启动进程 |
### 注意
- 选项必须写在 **jar 之前**;jar 之后的内容全部视为应用参数,所以 `--spring.profiles.active=prod`
不会被 kopsc 当成自己的选项。
- 应用参数里出现的 `-Xmx`、`-D...` 只是应用自己的参数,kopsc 不会解析它们。
- 前台运行依赖终端;长时间运行的场景请配合 `kopsc proc nohup` 或容器编排使用。
- `--gc-log` 指定的目录不存在时会自动创建。