2009-12-31 1 views
6

Uruchamiam profil NetBeans operacji rekursywnej, która obejmuje tworzenie klasy z polem java.lang.String. Na liście klas w zrzucie sterty profilu liczba pól String odpowiada liczbie klas utworzonych zgodnie z oczekiwaniami, jednak istnieje również podobna liczba instancji char[]. Tablice char odpowiadają za prawie 70% wykorzystania pamięci (!), Podczas gdy pole String ma około 7%.Dlaczego profiler wyświetla duże liczby wystąpień char [], gdy nie tworzę żadnych?

Co się tutaj dzieje? I jak mogę zmniejszyć liczbę instancji char[]?

Dzięki

Odpowiedz

13

Spójrz na String source code. Sam obiekt String zawiera buforowany kod skrótu, liczbę znaków (ponownie w celu optymalizacji), przesunięcie (ponieważ String.substr() wskazuje na oryginalne dane ciągu) i tablicę znaków, która zawiera rzeczywisty ciąg znaków dane. Stąd Twoje dane pokazujące, że String zużywa stosunkowo mało, ale większość pamięci jest zajęta przez tablice znaków.

2

klasy w realizacji Sun Java String używa char[] do przechowywania danych znakowych.

Wierzę, że można to sprawdzić, nie patrząc na kod źródłowy, za pomocą debuggera, aby przejrzeć zawartość String, lub za pomocą refleksji, aby przyjrzeć się obiektom wewnętrznym obiektu String.

Dlatego trudno byłoby zmniejszyć liczbę tworzonych char[], chyba że liczba tworzonych instancji String została zmniejszona.

1

Struny są wspierane przez tablice znaków, więc nie sądzę, że można zmniejszyć liczbę instancji char [] bez zmniejszania wartości ciągów znaków.

Czy próbowałeś usunąć niektóre ciągi znaków, aby sprawdzić, czy char [] również nie działa?

3

Tablice char stanowią prawie 70% z wykorzystaniem pamięci (!), Podczas gdy rachunków polowych Smyczkowych około 7%

Jest to subtelność profilowania pamięci znanego jako „zatrzymane rozmiar” i „płytkie wielkość”:

  • Niewielka wielkość oznacza, ile pamięci jest zajęta przez obiekt, nie licząc każdego dziecka obiektów zawiera. Zasadniczo oznacza to prymitywne pola.
  • zatrzymane rozmiar jest płytkie rozmiar plus size innych przedmiotów określonych przez obiekt, ale tylko te inne przedmioty, które są określone tylko przez ten obiekt (trudne do wyjaśnienia, prostą koncepcję).

String jest doskonałym przykładem. Zawiera garść prymitywnych pól plus char[]. The char[] stanowi ogromną większość zużycia pamięci. Płytki rozmiar ciągu jest bardzo mały, ale jego zachowany rozmiar jest znacznie większy, ponieważ obejmuje on char[].

Profiler NetBeans daje prawdopodobnie niewielki rozmiar, co nie jest zbyt przydatną figurą, ale jest łatwe do obliczenia. Zachowany rozmiar będzie obejmował użycie pamięci o numerze char[] w celu użycia pamięci o wartości String, ale obliczenie zachowanego rozmiaru jest kosztowne pod względem obliczeniowym, a profilery nie wykonają tej operacji, dopóki nie zostaną o to wyraźnie poproszone.

+1

Myślę, że masz na myśli char [], nie bajt [] –

+1

Ups. Bardzo zobowiązany. Naprawiony. – skaffman