2009-09-18 13 views
13

Czy można założyć, że obiekt Java zajmuje tylko 8 bajtów dla odwołania do obiektu, o ile wszystkie jego elementy są ustawione na null lub czy definicja członków już zużywa miejsce w instancji z jakiegoś powodu?Ile pamięci wykorzystuje obiekt Java, gdy wszystkie jego elementy mają wartość NULL?

Innymi słowy, jeśli mam dużą kolekcję obiektów, które chcę, aby przestrzeń była wydajna, czy mogę liczyć na pozostawienie nieużywanych elementów ustawionych na null w celu zmniejszenia śladu pamięci?

Odpowiedz

17

Nie, potrzebujesz 4 lub 8 bajtów (w zależności od tego, czy jest to system 32- lub 64-bitowy) dla każdej wartości zerowej przechowywanej w polu. W jaki sposób obiekt wiedziałby, że jego pole było puste, gdyby nie było czegoś, co można by o tym powiedzieć?

+0

Tak, dobre pytanie. :) Więc pole jest równoważne wskaźnikowi C (który również wymaga pamięci dla siebie)? –

+0

Tak, zmienne typów odniesienia (klasy) są odniesieniami do obiektów na stercie, równoważnymi wskaźnikom C. Pamięci zostanie podjęta dla wskaźnika i dla obiektu wskazuje. Typy pierwotne, takie jak int, są przechowywane bezpośrednio i zawsze mają ten sam rozmiar. – Joe

6

Nie, null jest również informacją i musi być również przechowywany.

0

Co z nazwami klas, obiektów i metod? Ponieważ możesz wywoływać, uzyskiwać dostęp lub tworzyć ich instancję za pomocą Java reflect, nazwy również muszą być przechowywane, prawda? Ale CMIIW.

Kage

+1

Nie są one przechowywane na wystąpienie. – CPerkins

+0

Prawda. Pierwotne pytanie dotyczyło kosztów przestrzeni kosmicznej. Dzięki :-). – Kage

1

Obiekt odwołuje się wciąż zajmie trochę pamięci, więc jedyne realne oszczędności pamięci będzie z obiektów sterty, która zostałaby określonych.

Tak więc, jeśli masz

MyClass { 
    public Object obj; 
    MyClass(Object o) { obj = o; } 
} 

MyClass a = new MyClass(new HashMap()); 
MyClass b = new MyClass(null); 

dwa obiekty a i b sami zajmują taką samą ilość pamięci (oboje posiadają jedno odwołanie), ale obiekt obj określoną przez a trwa pamięć o sterty, więc pamięć ta mogła zostać zapisana poprzez ustawienie odniesienia na wartość null.

1

Modele Java Language Specification i Java Virtual Machine Specification nie mówią nic o rozmiarze obiektów Java w pamięci - celowo pozostawia się niezdefiniowanie, ponieważ zależy to od implementacji maszyny JVM. Oznacza to, że nie można przyjąć żadnych założeń dotyczących ilości pamięci używanej przez obiekt Java w ogóle lub jaki jest układ pamięci obiektu Java w pamięci.

Jak już powiedzieli inni: Referencja (zmienna) zajmuje pamięć, niezależnie od tego, czy odniesienie to null, czy nie. Twoje obiekty nie będą się kurczyć i zajmą mniej pamięci, gdy ustawisz zmienne składowe na null.

0

Gdy obiekt Java ma wszystkich członków ma wartość NULL, wówczas będzie zużywał pamięć, ponieważ Ma również pewne dodatkowe wymagania dotyczące pamięci dla nagłówków, odwoływania i porządkowania.

Pamięć sterty używane przez obiekt Java zawiera

  • pamięć dla prymitywnych pól, w zależności od ich wielkości.

  • pamięć dla pól odniesienia (4 bajty każdy).

  • Nagłówek obiektu, składający się z kilku bajtów informacji o "sprzątaniu".

Obiekty w Javie wymaga też trochę „sprzątania” informacje, takie jak nagrywanie klasy Id i statusu flagi obiektu, takie jak to, czy obiekt jest obecnie osiągalny obecnie synchronizacja zablokowana itp

obiektu

Java rozmiar nagłówka zmienia się na 32 i 64-bitowe jvm.

Mimo że są to główne pamięci jvm, użytkownik wymaga również dodatkowych pól, np. Do wyrównania kodu e.t.c.

Jest to powód, dla którego twój obiekt Java ma wszystkich członków o wartości null, a następnie zużyje pamięć.

Powiązane problemy