Java w 4MB

szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
0

Mam prawie hello worlda w Javie (jest jeszcze Scanner, żeby się nie zamykała). Przy stercie ustawionej na 8MB jeszcze się uruchamia, ale jak schodzę do 4MB to wywala się na etapie kompilacji.

Kopiuj
java -Xmx4m -Xint .\test.java
An exception has occurred in the compiler (16). Please file a bug against the Java compiler via the Java bug reporting page (http://bugreport.java.com) after checking the Bug Database (http://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.
java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.regex.Pattern.escape(Pattern.java:2515)
        at java.base/java.util.regex.Pattern.atom(Pattern.java:2286)
        at java.base/java.util.regex.Pattern.sequence(Pattern.java:2159)
        at java.base/java.util.regex.Pattern.expr(Pattern.java:2069)
        at java.base/java.util.regex.Pattern.compile(Pattern.java:1783)
        at java.base/java.util.regex.Pattern.<init>(Pattern.java:1430)
        at java.base/java.util.regex.Pattern.compile(Pattern.java:1069)
        at java.base/java.util.regex.Pattern.matches(Pattern.java:1174)
        at java.base/java.lang.String.matches(String.java:2042)
        at java.compiler@16/javax.tools.JavaFileManager$Location.isModuleOrientedLocation(JavaFileManager.java:170)
        at jdk.compiler/com.sun.tools.javac.file.JavacFileManager.checkNotModuleOrientedLocation(JavacFileManager.java:1283)
        at jdk.compiler/com.sun.tools.javac.file.JavacFileManager.inferBinaryName(JavacFileManager.java:785)
        at java.compiler@16/javax.tools.ForwardingJavaFileManager.inferBinaryName(ForwardingJavaFileManager.java:87)        
        at jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:721)
        at jdk.compiler/com.sun.tools.javac.code.ClassFinder.scanModulePaths(ClassFinder.java:609)
        at jdk.compiler/com.sun.tools.javac.code.ClassFinder.fillIn(ClassFinder.java:558)
        at jdk.compiler/com.sun.tools.javac.code.ClassFinder.complete(ClassFinder.java:300)
        at jdk.compiler/com.sun.tools.javac.code.ClassFinder$$Lambda$46/0x0000000800c923e8.complete(Unknown Source)
        at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:681)
        at jdk.compiler/com.sun.tools.javac.code.Symbol$PackageSymbol.members(Symbol.java:1175)
        at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$ImportsPhase.resolveImports(TypeEnter.java:357)
        at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$ImportsPhase.runPhase(TypeEnter.java:325)
        at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.doCompleteEnvs(TypeEnter.java:286)
        at jdk.compiler/com.sun.tools.javac.comp.TypeEnter$Phase.completeEnvs(TypeEnter.java:255)
        at jdk.compiler/com.sun.tools.javac.comp.TypeEnter.complete(TypeEnter.java:202)
        at jdk.compiler/com.sun.tools.javac.code.Symbol.complete(Symbol.java:681)
        at jdk.compiler/com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1409)
        at jdk.compiler/com.sun.tools.javac.comp.Enter.complete(Enter.java:584)
        at jdk.compiler/com.sun.tools.javac.comp.Enter.main(Enter.java:561)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:1069)
        at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:936)
        at jdk.compiler/com.sun.tools.javac.api.JavacTaskImpl.lambda$doCall$0(JavacTaskImpl.java:104)
error: compilation failed

Macie pomysł, jakie jeszcze można parametry dorzucić, żeby zredukować zużycie pamięci?


𐤃𐤐𐤀
JP
  • Rejestracja:prawie 6 lat
  • Ostatnio:około rok
  • Postów:24
0

Skompiluj używając graalvm kompilatora

edytowany 1x, ostatnio: JacekPs
szatkus
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 3 lata
  • Postów:227
0

Graala wywaliłem i nie chce mi się teraz znowu walczyć z instalacją. Sprawdzę sobie na razie, ile jestem w stanie ugrać na JVM.

Przypomniałem sobie, że przecież mogę to skompilować do pliku class jak za starych dobrych czasów. Zeszło do 20MB, więc redukcja heapu już wiele nie pomoże. -Xint pomaga. Jeszcze jakieś pomysły?


𐤃𐤐𐤀
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około 18 godzin
3

A na czym się teraz wywala? Kompilacja bajtkodu wywalała się (jak widać) na regexach.

Spróbuj jeszcze -XX:+UseSerialGC

W Javie 9+ jest jlink za pomocą którego możesz zrobić zminimalizowane JRE.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
szatkus
Flaga nic nie dała, ale używając jlinka udało mi się zejść do 11MB i zrzucić heap do 2MB.
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1875
0

Czegoś nie rozumiem :) odpalasz program javowy, więc to nie jest etap kompilacji, a startu JVM i inicjalizacji klas. Pewnie masz jakieś pole statyczne z tym regexpem, którego skompilowanie wywala heapa. Może po prostu użyłeś skrótu myślowego.


”Engineering is easy. People are hard.” Bill Coughran
szatkus
Bo na początku nie odpalałem skompilowanego pliku, tylko plik java, które od paru wersji javy są z automatu kompilowane. Już wróciłem do tradycyjnego rozdziału kompilacji od uruchamiania i mi ten etap kompilacji odpadł.
ZN
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:49
0

-Xshare:off -XX:TieredStopAtLevel=0 -XX:+UseStringDeduplication
to może coś dać, choć mogę się mylić

edytowany 3x, ostatnio: ZabawnyNick
99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
1

screenshot-20210813133236.png

Na mac'u można zejść do 1MB (pusty static void main).

Zapewne jak byś używał tak mało stdlib'a jak to tylko możliwe to dało by się jeszcze coś ugrać.


Holy sh*t, with every month serenityos.org gets better & better...
edytowany 2x, ostatnio: 99xmarcin

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.