Tworzę projekt w Netbeans.
Zauważyłem, że we właściwościach projektu można ustawić początkową i maksymalną wielkośc sterty, ale zauważyłem dziwną rzecz:
Jak ustawię "-Xms16m -Xmx1600m", to program nie uruchamia się i wyświetla komunikat:
Error occurred during initialization of VM
Could not create the Java virtual machine.
Could not reserve enough space for object heap
Java Result: 1
Jak ustawię "-Xms16m -Xmx800m", to program się uruchamia. Cały program, to jest wyświetlenie "Hello world" na konsoli, więc program nie tworzy jakiś nie wiadomo, jak dużych obiektów.
Dziwne jest to, że w obu przypadkach wielkość początkowa jest stała, a zmieniam wartość maksymalną, którą można przeznaczyć na potrzeby sterty programu Javy.
Jestem przekonany, że jak ustawię "-Xms16m -Xmx1600m", to na innym komputerze z większą pamięcią RAM program również się uruchomi.
Jak ustawić parametry uruchamiania, żeby spełnić następujące założenia:
- Wielkość sterty nie jest ograniczona, jedynym ograniczeniem jest wielkość pamięci RAM w danym komputerze
- Program zajmuje tylko tyle pamięci RAM, ile faktycznie jest obiektów
- Nie jest istotna wielkość pamięci w momencie uruchomienia programu, problemy z działaniem byłyby dopiero przy próbie utworzenia obiektu przy pełnej pamięci RAM
- Jeżeli jest kilka uruchomionych programów w Javie jednocześnie na tym samym komputerze, to każdy może potencjalnie wykorzystać całą pamięć RAM.
W językach C++ i C# każdy jeden program spełnia powyższe założenia.
Rozbudowałem procedurę Main do takiej postaci:
public static void main(String[] args)
{
ArrayList<byte[]> Lista = new ArrayList<byte[]>();
int XX = 0;
while (true)
{
System.out.println(XX);
Lista.add(new byte[100000000]);
XX++;
}
}
Przy ustawieniu "-Xmx500m" widać, że program tworzy 5 tablic bajtowych zajmujących niecałe 100MB każda, a przy "-Xmx800m" program tworzy 8 tablic bajtowych, a jak skasuję parametry uruchamiania, to program tworzy tylko dwie tablice bajtowe. Jak ustawiłem "-Xmx1200m", to program się uruchomił, ale powstało tylko 9 tablic, a w menedżerze zadań pamięć rzeczywiście się wypełniła. Przypuszczam, że na innym komputerze przy "-Xmx1200m" powstanie 12 tablic, a przy ustawieniu "-Xmx2000m" program się również uruchomi i utworzy 20 tablic bajtowych. Jednak na moim komputerze z takim ustawieniem program w ogóle się nie uruchamia.
Chciałbym, żeby ten program uruchomił się na każdym komputerze bez względu na wielkość zainstalowanej pamięci i utworzył tyle tablic bajtowych, ile da radę do zapełnienia pamięci RAM. Jak ustawić parametry uruchamiania? Jakbym pisał ten program w C++ lub C#, to taki problem w ogóle by nie istniał.