Ile pamięci zajmuje obiekt w Javie?


Zacznę może od tego, że aktualnie poczytuję “Java. Praktyczny kurs” Marcina Lisa i przyznam, że całkiem mi się spodobała, więc polecam 😉 .

Czytałem akurat rozdział o obiektowości, a dokładniej tam gdzie autor pisał o dziedziczeniu i przesłanianiu składowych klas – tutaj może cytat:

“W klasie A zostało zdefiniowane pole o nazwie liczba i typie int . W klasie B , która dziedziczy po A , ponownie zostało zadeklarowane pole o takiej samej nazwie i identycznym typie. Trzeba sobie jednak dobrze uświadomić, że każdy obiekt klasy B będzie w takiej sytuacji zawierał DWA pola o nazwie liczba — jedno pochodzące z klasy A , drugie z B. Tym polom można z kolei przypisywać różne wartości.”

No i wtedy przyszła mi do głowy myśl, że jeżeli ten obiekt będzie zawierał dwa pola, to będzie również rezerwował pamięć na dwa pola, więc jeżeli jedno usunę, to powinien zajmować jej mniej, prawda? 🙂 . Zaciekawiło mnie to i chciałem zobaczyć jak w trakcie modyfikacji klasy lub klas, w przypadku dziedziczenia, zmienia się rezerwowana pamięć przez obiekty. Tylko jak to sprawdzić? – zacząłem szukać. Na szczęście nie zajęło mi to jakoś bardzo długo (eh, miałem czytać tę książkę…) i udało się znaleźć odpowiedni sposób. Od Java 8 dostępna jest metoda, która w prosty sposób pozwala podejrzeć ilość rezerwowanej pamięci  – kod poniżej:

package pl.devwannabe.dziedziczenie;
import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;

public class Main  {

    public static void main(String[] args) {

    System.out.println(ObjectSizeCalculator.getObjectSize(new TestPamieci2()));

    }
}

TestPamieci2 to klasa która “extenduje” TestPamieci1. Mam dwa pola, po jednym w klasie bazowej i potomnej. Metoda zwraca wartość w bajtach. Uruchamiam powyższy kod i metoda zwraca 24 bajty. Usuwam pole z klasy bazowej, uruchamiam jeszcze raz i bingo! metoda zwraca 16 bajtów 🙂 . Ogólnie zauważyłem, że wartość rezerwowanej pamięci przez obiekty zmienia się wraz z dokładaniem lub odejmowaniem składowych klas o 8 bajtów, niezależnie od typów danych (dochodzi do zaokrągleń). Wniosek więc taki, że rezerwowana pamięć przez obiekty w Java to zawsze wielokrotność 8 bajtów.

Nie jestem pewien tego jakie ma praktyczne zastosowanie możliwość zliczania rezerwowanej pamięci przez obiekty. Może pamięć teraz tania i bez znaczenia jest ile jej zajmują 😉 . Cieszą jednak takie małe odkrycia, a jak coś cieszy, to jest i chęć żeby się podzielić.

Bajko 🙂

Warning! Tego nie pisał programista z doświadczeniem, ale dev-wannabe. Jak coś poknociłem, chętnie się o tym dowiem.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *