W pierwszych wersjach Java Virtual Machine (JVM) stosowano tę samą organizację pamięci jak w C++. Było to bardzo nieefektywne podejście. Twierdzę, że „zarządzanie pamięcią w Javie jest szybsze niż w C++.” A na podstawie czego?
W C++ alokowanie nowego obiektu (operator new) wymagało znalezienia nowego miejsca w drzewie binarnym lub na stercie (heap). Sterta jest drzewem binarnym, w którym minimum znajduje się na samej górze. W stercie minimalna wartość jest dostępna w czasie stałym – natychmiast. Informacje o wolnych blokach pamięci w C++ były przechowywane właśnie na stercie. Gdy trzeba było alokować nowy obiekt (za pomocą operatora new) pamięci, znajdowało się najmniejszą możliwą przestrzeń (wierzchołek sterty), na której można było to zrobić i używało się jej. Wierzchołek sterty był usuwany. Było to całkiem efektywne, ponieważ manipulowanie stertą ma całkiem dobrą złożoność czasową. Było to też dobre, ponieważ najpierw zajmowano małe bloki pamięci.
W Javie to nie działa w ten sposób, jest to bardziej skomplikowane. W Javie przeprowadzono statystykę cyklu życia obiektów. Śledzono, jak obiekty powstają i jak znikają. Okazało się, że obiekty, które są młodsze, mają większą szansę na szybkie zniknięcie. Tylko nieliczne z nowych obiektów przetrwają dłużej. Jak żołnierze w czasie II wojny światowej. Doświadczeni pozostawali, ale nowicjusze umierali. Wprowadzono Generacyjny Garbage Collector (GCC). GCC dzieli pamięć na kilka generacji, np. cztery. Gdy alokowane są obiekty, to są one układane jeden za drugim, bez sensu, jeden po drugim. W C++ alokowanie nowego obiektu oznacza reorganizację sterty, aby zająć najmniejszy blok. W przeciwieństwie do C++, w Javie alokowanie obiektu odbywa się złożonością stałą. Podsumowując, stworzenie nowego obiektu za pomocą operatora new nie wymaga wiele wysiłku.
Marián Knězek