Skip to content

Commit bf92b62

Browse files
committed
fix: restrict -XX:ActiveProcessorCount to HotSpot JREs to match Ruby buildpack
Ruby reference (open_jdk_like_jre.rb): -XX:ActiveProcessorCount is added in the OpenJDK-like JRE release step only. IBM JRE initializer never sets it — IBM JRE already had its own extraFinalizeOpts with -Xtune:virtualized and -Xshareclasses:none (ibm.go, unchanged). Previously -XX:ActiveProcessorCount was in the universal baseOpts, so IBM received it on top of its own opts. Fix: move it out of baseOpts into extraFinalizeOpts on each HotSpot JRE (OpenJDK, Oracle, SapMachine, Zulu, GraalVM). IBM JRE and its existing opts are untouched. Only -Djava.io.tmpdir=$TMPDIR remains in baseOpts — universal in Ruby too.
1 parent 2c5754b commit bf92b62

7 files changed

Lines changed: 39 additions & 6 deletions

File tree

src/java/jres/base_jre.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ func (b *BaseJRE) Finalize() error {
156156

157157
baseOpts := []string{
158158
"-Djava.io.tmpdir=$TMPDIR",
159-
"-XX:ActiveProcessorCount=$(nproc)",
160159
}
161160
if err := WriteJavaOpts(b.ctx, strings.Join(baseOpts, " ")); err != nil {
162161
b.ctx.Log.Warning("Failed to write base JAVA_OPTS: %s", err.Error())
@@ -189,6 +188,16 @@ func (b *BaseJRE) Version() string {
189188
return b.installedVersion
190189
}
191190

191+
// ExtraFinalizeOpts returns the JRE-specific JVM options written during Finalize.
192+
// These are opts beyond the universal base opts (-Djava.io.tmpdir) — e.g. HotSpot
193+
// flags for OpenJDK-like JREs, or J9 tuning flags for IBM JRE.
194+
func (b *BaseJRE) ExtraFinalizeOpts() string {
195+
if b.extraFinalizeOpts == nil {
196+
return ""
197+
}
198+
return b.extraFinalizeOpts()
199+
}
200+
192201
func (b *BaseJRE) MemoryCalculatorCommand() string {
193202
if b.memoryCalc == nil {
194203
return ""

src/java/jres/graalvm.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ type GraalVMJRE struct{ BaseJRE }
77

88
// NewGraalVMJRE creates a new GraalVM JRE provider.
99
func NewGraalVMJRE(ctx *common.Context) *GraalVMJRE {
10-
return &GraalVMJRE{newBaseJRE(ctx, "GraalVM", "graalvm", []string{"graalvm"}, nil, "(ensure repository_root is configured)")}
10+
b := newBaseJRE(ctx, "GraalVM", "graalvm", []string{"graalvm"}, nil, "(ensure repository_root is configured)")
11+
b.extraFinalizeOpts = func() string { return "-XX:ActiveProcessorCount=$(nproc)" }
12+
return &GraalVMJRE{b}
1113
}

src/java/jres/jre_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,20 @@ IMPLEMENTOR="Eclipse Adoptium"`
616616
})
617617
})
618618

619+
Describe("JRE-specific finalize opts (Ruby parity)", func() {
620+
It("OpenJDK includes -XX:ActiveProcessorCount (HotSpot flag)", func() {
621+
Expect(jres.NewOpenJDKJRE(ctx).ExtraFinalizeOpts()).To(ContainSubstring("-XX:ActiveProcessorCount"))
622+
})
623+
624+
It("IBM JRE does not include -XX:ActiveProcessorCount (J9 incompatible)", func() {
625+
Expect(jres.NewIBMJRE(ctx).ExtraFinalizeOpts()).NotTo(ContainSubstring("-XX:ActiveProcessorCount"))
626+
})
627+
628+
It("IBM JRE includes J9-specific tuning opts", func() {
629+
Expect(jres.NewIBMJRE(ctx).ExtraFinalizeOpts()).To(ContainSubstring("-Xtune:virtualized"))
630+
})
631+
})
632+
619633
Describe("JRE Detection with Environment Variables", func() {
620634
var testLogBuffer *bytes.Buffer
621635
var testCtx *common.Context

src/java/jres/openjdk.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ type OpenJDKJRE struct{ BaseJRE }
77

88
// NewOpenJDKJRE creates a new OpenJDK JRE provider.
99
func NewOpenJDKJRE(ctx *common.Context) *OpenJDKJRE {
10-
return &OpenJDKJRE{newBaseJRE(ctx, "OpenJDK", "openjdk", []string{"jdk", "jre"}, nil, "")}
10+
b := newBaseJRE(ctx, "OpenJDK", "openjdk", []string{"jdk", "jre"}, nil, "")
11+
b.extraFinalizeOpts = func() string { return "-XX:ActiveProcessorCount=$(nproc)" }
12+
return &OpenJDKJRE{b}
1113
}

src/java/jres/oracle.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ type OracleJRE struct{ BaseJRE }
77

88
// NewOracleJRE creates a new Oracle JRE provider.
99
func NewOracleJRE(ctx *common.Context) *OracleJRE {
10-
return &OracleJRE{newBaseJRE(ctx, "Oracle JRE", "oracle", []string{"jdk", "jre"}, nil, "")}
10+
b := newBaseJRE(ctx, "Oracle JRE", "oracle", []string{"jdk", "jre"}, nil, "")
11+
b.extraFinalizeOpts = func() string { return "-XX:ActiveProcessorCount=$(nproc)" }
12+
return &OracleJRE{b}
1113
}

src/java/jres/sapmachine.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ type SapMachineJRE struct{ BaseJRE }
77

88
// NewSapMachineJRE creates a new SAP Machine JRE provider.
99
func NewSapMachineJRE(ctx *common.Context) *SapMachineJRE {
10-
return &SapMachineJRE{newBaseJRE(ctx, "SapMachine", "sapmachine", []string{"sapmachine"}, nil, "")}
10+
b := newBaseJRE(ctx, "SapMachine", "sapmachine", []string{"sapmachine"}, nil, "")
11+
b.extraFinalizeOpts = func() string { return "-XX:ActiveProcessorCount=$(nproc)" }
12+
return &SapMachineJRE{b}
1113
}

src/java/jres/zulu.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ type ZuluJRE struct{ BaseJRE }
77

88
// NewZuluJRE creates a new Zulu JRE provider.
99
func NewZuluJRE(ctx *common.Context) *ZuluJRE {
10-
return &ZuluJRE{newBaseJRE(ctx, "Zulu", "zulu", []string{"zulu"}, nil, "")}
10+
b := newBaseJRE(ctx, "Zulu", "zulu", []string{"zulu"}, nil, "")
11+
b.extraFinalizeOpts = func() string { return "-XX:ActiveProcessorCount=$(nproc)" }
12+
return &ZuluJRE{b}
1113
}

0 commit comments

Comments
 (0)