Ostatecznie zawsze masz skończoną maksymalną stertę, z której możesz korzystać bez względu na platformę, na której pracujesz. W 32-bitowym systemie Windows jest to około 2GB
(nie sterty, ale całkowita ilość pamięci na proces). Zdarza się, że Java decyduje się na zmniejszenie domyślnej wartości (prawdopodobnie po to, aby programiści nie mogli tworzyć programów, które mają przydział pamięci, nie wpadając w ten problem i nie musząc dokładnie zbadać, co robią).
Biorąc to pod uwagę, istnieje kilka metod, które można zastosować, aby określić, jakiej ilości pamięci potrzebujesz lub zmniejszyć ilość używanej pamięci. Jednym z powszechnych błędów w przypadku śmieci, takich jak Java lub C #, jest przechowywanie odniesień do obiektów, których już nie używasz, lub przydzielanie wielu obiektów, gdy można zamiast tego użyć ich ponownie . Tak długo, jak obiekty mają do nich odniesienie, będą nadal korzystać z miejsca na sterty, ponieważ śmieciarz ich nie usunie.
W takim przypadku możesz użyć profilera pamięci Java, aby ustalić, które metody w twoim programie przydzielają dużą liczbę obiektów, a następnie ustalić, czy istnieje sposób, aby upewnić się, że nie są one już przywoływane, lub w ogóle ich nie przydzielać. Jedną z opcji, z których korzystałem w przeszłości, jest „JMP” http://www.khelekore.org/jmp/ .
Jeśli stwierdzisz, że alokujesz te obiekty z jakiegoś powodu i musisz trzymać się referencji (w zależności od tego, co robisz, może tak być), po prostu musisz zwiększyć maksymalny rozmiar sterty podczas uruchamiania programu. Jednak po wykonaniu profilowania pamięci i zrozumieniu, w jaki sposób przydzielane są twoje obiekty, powinieneś mieć lepszy pomysł na to, ile pamięci potrzebujesz.
Ogólnie rzecz biorąc, jeśli nie możesz zagwarantować, że twój program będzie działał w pewnej skończonej ilości pamięci (być może w zależności od wielkości wejściowej), zawsze napotkasz ten problem. Dopiero po wyczerpaniu tego wszystkiego będziesz musiał zajrzeć do buforowania obiektów na dysk itp. W tym momencie powinieneś mieć bardzo dobry powód, aby powiedzieć „Potrzebuję Xgb pamięci” do czegoś i nie możesz obejść tego, ulepszając algorytmy lub wzorce alokacji pamięci. Zasadniczo dzieje się tak zwykle tylko w przypadku algorytmów działających na dużych zestawach danych (takich jak baza danych lub jakiś program do analizy naukowej), a następnie techniki takie jak buforowanie i IO odwzorowywane w pamięci stają się przydatne.