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 补充导航与示例
This commit is contained in:
@@ -452,6 +452,35 @@ func Builtin() *Registry {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "java.run",
|
||||
Group: "java",
|
||||
Summary: "按 JDK 版本套用调优参数并前台运行 Java 应用",
|
||||
Action: "以 kopsc 内置的业界常用调优参数启动 Spring 风格应用:自动识别宿主机的 CPU 与可用内存" +
|
||||
"(容器内以 cgroup 限额为准),堆大小默认取可用内存的 50%;按检测到的 JDK 版本套用对应参数," +
|
||||
"JDK 8 使用 -Xloggc 组,JDK 9+ 使用 -Xlog: 组;应用参数写在 jar 之后,或用 -- 分隔。" +
|
||||
"前台运行,Ctrl+C 可停止,退出码透传",
|
||||
Usage: "<app.jar> [-- 应用参数...]",
|
||||
MinArgs: 1,
|
||||
ConfirmBuiltin: "java.run.preview",
|
||||
Variants: []Variant{
|
||||
{
|
||||
Match: Match{OS: "linux"},
|
||||
Builtin: "java.run",
|
||||
Note: "Linux 内置实现(/proc 与 cgroup 探测资源)",
|
||||
},
|
||||
{
|
||||
Match: Match{OS: "darwin"},
|
||||
Builtin: "java.run",
|
||||
Note: "macOS 内置实现(sysctl 探测内存)",
|
||||
},
|
||||
{
|
||||
Match: Match{OS: "windows"},
|
||||
Builtin: "java.run",
|
||||
Note: "Windows 内置实现(wmic 探测内存)",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
ID: "pkg.refreshindex",
|
||||
Group: "pkg",
|
||||
|
||||
@@ -25,7 +25,7 @@ func TestBuiltinIDsStable(t *testing.T) {
|
||||
"docker.prunebuilder", "docker.prunevolumes", "docker.clearall",
|
||||
"docker.compose.up", "docker.compose.down", "docker.compose.ps", "docker.compose.logs",
|
||||
"diagnose",
|
||||
"disk.usage", "net.pids", "net.ports", "proc.nohup", "proc.wait", "pkg.refreshindex",
|
||||
"disk.usage", "net.pids", "net.ports", "proc.nohup", "proc.wait", "java.run", "pkg.refreshindex",
|
||||
}
|
||||
if got := reg.IDs(); !reflect.DeepEqual(got, want) {
|
||||
t.Fatalf("IDs() =\n%v\nwant\n%v", got, want)
|
||||
@@ -373,3 +373,34 @@ func TestProcWaitIsBuiltinEverywhere(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestJavaRunIsBuiltinEverywhere(t *testing.T) {
|
||||
reg := Builtin()
|
||||
cmd, ok := reg.Lookup("java.run")
|
||||
if !ok {
|
||||
t.Fatal("java.run not found")
|
||||
}
|
||||
if cmd.RequiresYes {
|
||||
t.Error("java.run only starts an application; it must not require --yes")
|
||||
}
|
||||
if cmd.MinArgs != 1 || !strings.Contains(cmd.Usage, ".jar") {
|
||||
t.Errorf("java.run must require the jar argument, got MinArgs=%d Usage=%q", cmd.MinArgs, cmd.Usage)
|
||||
}
|
||||
for _, want := range []string{"JDK", "内存"} {
|
||||
if !strings.Contains(cmd.Action, want) {
|
||||
t.Errorf("java.run Action should mention %q:\n%s", want, cmd.Action)
|
||||
}
|
||||
}
|
||||
seen := map[string]bool{}
|
||||
for _, v := range cmd.Variants {
|
||||
if v.Builtin != "java.run" || len(v.Argv) != 0 {
|
||||
t.Errorf("variant for %s should be the java.run builtin, got %+v", v.Match.OS, v)
|
||||
}
|
||||
seen[v.Match.OS] = true
|
||||
}
|
||||
for _, osName := range []string{"linux", "darwin", "windows"} {
|
||||
if !seen[osName] {
|
||||
t.Errorf("java.run lacks a %s variant", osName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user