installer: run.bat 후처리에 JVM 튜닝 플래그 주입 추가
메모리(-Xms/-Xmx)는 기존 설정 그대로 두고 Aikar 권장 G1 GC 플래그 6종 (-XX:+UnlockExperimentalVMOptions, -XX:+UseG1GC, -XX:G1NewSizePercent=20, -XX:G1ReservePercent=20, -XX:MaxGCPauseMillis=50, -XX:G1HeapRegionSize=32M) 을 -jar 앞에 끼워 넣는다. -XX:+UseG1GC 가 이미 있으면 멱등 처리.
This commit is contained in:
@@ -463,6 +463,31 @@ ipcMain.handle('server:install', async (_event, payload: ServerInstallPayload) =
|
|||||||
* 이 경우 라우터의 UPnP TTL 에 의해 자동 만료되며, 다음 실행 시 Add 전에 Remove 를
|
* 이 경우 라우터의 UPnP TTL 에 의해 자동 만료되며, 다음 실행 시 Add 전에 Remove 를
|
||||||
* 시도하므로 idempotent.
|
* 시도하므로 idempotent.
|
||||||
*/
|
*/
|
||||||
|
// Aikar 권장 페이퍼 G1 GC 튜닝 셋의 기본형. 메모리(-Xms/-Xmx) 는 사용자가
|
||||||
|
// 이미 설치 설정에서 정하므로 여기서 건드리지 않는다.
|
||||||
|
const DEFAULT_JVM_FLAGS = [
|
||||||
|
'-XX:+UnlockExperimentalVMOptions',
|
||||||
|
'-XX:+UseG1GC',
|
||||||
|
'-XX:G1NewSizePercent=20',
|
||||||
|
'-XX:G1ReservePercent=20',
|
||||||
|
'-XX:MaxGCPauseMillis=50',
|
||||||
|
'-XX:G1HeapRegionSize=32M'
|
||||||
|
]
|
||||||
|
|
||||||
|
/**
|
||||||
|
* java 호출 라인에 JVM 튜닝 플래그를 끼워 넣는다. -jar 앞에 삽입(존재 시),
|
||||||
|
* 없으면 java 토큰 바로 뒤에 삽입. -XX:+UseG1GC 가 이미 들어 있으면 멱등.
|
||||||
|
*/
|
||||||
|
function injectJvmFlags(javaLine: string): string {
|
||||||
|
if (javaLine.includes('-XX:+UseG1GC')) return javaLine
|
||||||
|
const flagsStr = DEFAULT_JVM_FLAGS.join(' ')
|
||||||
|
const jarMatch = /\s-jar\b/.exec(javaLine)
|
||||||
|
if (jarMatch && jarMatch.index >= 0) {
|
||||||
|
return `${javaLine.slice(0, jarMatch.index)} ${flagsStr}${javaLine.slice(jarMatch.index)}`
|
||||||
|
}
|
||||||
|
return javaLine.replace(/^(\s*java(?:\.exe)?)(\s|$)/i, `$1 ${flagsStr}$2`)
|
||||||
|
}
|
||||||
|
|
||||||
async function injectUpnpToRunBat(installPath: string): Promise<void> {
|
async function injectUpnpToRunBat(installPath: string): Promise<void> {
|
||||||
const runBat = path.join(installPath, 'run.bat')
|
const runBat = path.join(installPath, 'run.bat')
|
||||||
if (!fs.existsSync(runBat)) {
|
if (!fs.existsSync(runBat)) {
|
||||||
@@ -488,6 +513,14 @@ async function injectUpnpToRunBat(installPath: string): Promise<void> {
|
|||||||
}
|
}
|
||||||
if (pauseIdx === -1) pauseIdx = lines.length
|
if (pauseIdx === -1) pauseIdx = lines.length
|
||||||
|
|
||||||
|
// java 호출 라인에 JVM 튜닝 플래그(Aikar 권장 G1 설정)를 주입.
|
||||||
|
// 메모리 옵션(-Xms/-Xmx)은 기존 값을 그대로 유지하고, GC/region 관련만 -jar 앞에 끼워 넣는다.
|
||||||
|
const javaLine = lines[javaIdx]
|
||||||
|
lines[javaIdx] = injectJvmFlags(javaLine)
|
||||||
|
if (lines[javaIdx] !== javaLine) {
|
||||||
|
sendLog('run.bat 의 java 호출에 JVM 튜닝 플래그(G1 GC, region/pause 등)를 추가했습니다.')
|
||||||
|
}
|
||||||
|
|
||||||
// PowerShell 한 줄로 처리: server.properties 의 server-port 우선, 없으면 25565.
|
// PowerShell 한 줄로 처리: server.properties 의 server-port 우선, 없으면 25565.
|
||||||
// Add 전에 같은 포트의 매핑이 남아 있으면 먼저 Remove 하여 idempotent 하게 만든다.
|
// Add 전에 같은 포트의 매핑이 남아 있으면 먼저 Remove 하여 idempotent 하게 만든다.
|
||||||
const addBlock = [
|
const addBlock = [
|
||||||
|
|||||||
Reference in New Issue
Block a user