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

4.4 KiB
Raw Blame History

Java 应用(kopsc java <子命令>)

返回 README.md

按 JDK 版本自动套用调优参数并前台运行 Java 应用。你不需要逐条抄 JVM 参数, kopsc 会根据宿主机(或容器)的实际资源算出堆大小,并按 JDK 版本选择对应的 GC 日志写法。

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 可停止, 退出码原样返回给调用方。

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 指定的目录不存在时会自动创建。