Portál AbcLinuxu, 9. května 2025 00:09
-Xss
), ale to jde jen do velikosti 2 GB (-Xss2047M
), což nestačí. Při pokusu o nastavení větší velikosti zásobníku (např. -Xss2048M
) dostanu chybový výpis začínající:
# # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x0000000000000000, pid=9351, tid=139969911744256 # # JRE version: 7.0_17-b02 # Java VM: OpenJDK 64-Bit Server VM (23.7-b01 mixed mode linux-amd64 compressed oops)Místo OpenJDK jsem zkoušel IKVM.NET, tam dostanu následující chybu:
System.TypeLoadException: Could not load type 'com.google.javascript.jscomp.ComposeWarningsGuard' from assembly 'ikvm_dynamic_assembly__26728760, Version=2013.405.1736.22304, Culture=neutral, PublicKeyToken=null'.Otázka tedy je, jak spustit Javovský program, jenž potřebuje více než 2 GB zásobníku?
Řešení dotazu:
Treba jsi objevil chybu v Google Closure kompilatoruPodobné skripty, ale menší (kolem 1-2 MB) se mi přeložit podařilo. Skript, jenž překládám teď, je větší (3,2 MB), ale v principu stejný, neboť je vygenerován stejným nástrojem. Problém pro Google Closure jsou možná delší funkce. Když v souboru ponechám pouze nejdelší funkci
__IDR__.APPLY0
, tak problém přetrvává - soubor má pouze 1,2 MB, a přesto dostanu java.lang.RuntimeException: java.lang.StackOverflowError
.
COMPILER_STACK_SIZE
, tudíž nastavení -Xss
nemá žádný vliv. Vyřešil jsem to tedy tak, že jsem si stáhl zdrojáky a změnil konstantu (v souboru src/com/google/javascript/jscomp/Compiler.java
) z původní hodnoty 1 << 21
na novou hodnotu 1 << 27
.
Na závěr přikládám zdůvodnění, proč se konstanta používá:
Under JRE 1.6, the JS Compiler overflows the stack when running on some large or complex JS code. When threads are available, we run all compile jobs on a separate thread with a larger stack. That way, we don't have to increase the stack size for every thread (which is what -Xss does).
java -Xss2047M -jar compiler.jar --js Vstup.js --js_output_file Vystup.js --language_in ECMASCRIPT5
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.