2016-08-26 25 views
8

wiem, że jest nieodłącznym napowietrznej JVM, a ja chciałem zrobić dalsze badania, aby zobaczyć dokładnie to, co jest z napowietrznych.Dlaczego JVM używa gigantycznego int [] wszystkich 0?

Korzystanie profilera YourKit udało mi się dowiedzieć, że istnieją gigant int [] wypełnione pozornie losowej informacji. Zgaduję, że przechowują one pewne wskaźniki wydajności i inne rzeczy, które JVM wykorzystuje do optymalizacji aplikacji; ale ku mojemu zaskoczeniu wszystkie elementy mają wartość 0.

Aby uzyskać moje wyniki Użyłem następujący program „nic nie robić”, tak, że wyniki obejmują tylko rzeczy dzieje się na JVM.

public final class Main { 

    public static void main(String[] args) throws InterruptedException { 
     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

To jest zrzut ekranu wyników profilowania i mogę przesłać migawkę pamięci, jeśli to konieczne.

Screenshot from YourKit profiler

+3

Może dlatego, że on pisał to pytanie ...? –

+1

@Jire Prosimy o powstrzymanie się od wprowadzania istotnych zmian, które przejmą pocztę. W tym przypadku PO zatwierdził to, ale ogólnie jest to niedopuszczalne. – 4castle

+0

@ 4castle Angielski nie jest moim ojczystym językiem, więc doceniam jego edycje. Dzięki za FYI. –

Odpowiedz

0

Grałem około z tym trochę więcej i to na pewno ma do czynienia z wielkością sterty. Na przykład, jeśli ustawię opcję -Xmx5m -Xmx5m, alokacja tablicy int zniknie. Natomiast jeśli ustawię opcję -Xmx5g -Xms5g, to powstanie dużo więcej tablic.

enter image description here

zastanawiam się co oni używać ich do.

otrzymał pomoc z/r/java.

„Najprawdopodobniej są to przedmioty wypełniające w wątku lokalne buforów środków, które pomogą z sterty parsability. https://shipilev.net/jvm-anatomy-park/5-tlabs-and-heap-parsability/ Mają być nieosiągalny i sączy przez narzędzi analizowania zrzutów sterty w swojej zrzucie, profiler pokaże” All Obiekty (osiągalny i nieosiągalny) "."

+0

Prawdopodobnie zostanie oznaczona flagą i ewentualnie usunięta, ponieważ nie jest odpowiedzią na to pytanie.Zamiast tego powinieneś edytować swoje pytanie i dołączyć nowe znalezione informacje. – Marco13

1

można znaleźć odpowiedź analizując przychodzące linki do tych tablic. Kliknij prawym przyciskiem myszy dostępną tablicę, wybierz "Wybrane obiekty", a następnie przełącz się na "Przychodzące referencje".

odkryłem, że istnieją tabele w sun.util.calendar.ZoneInfo, sun.util.Calendar.BaseCalendar, java.util.Currency itp

Trudno powiedzieć na pewno, ale najprawdopodobniej, te duże nieosiągalne nie-wyzerowany tablice były używane przez JVM załadować Java kodu bajtowego od .class-files. JVM nie potrzebuje ich po kompilacji, więc zostały wydane, ale jeszcze nie zostały zebrane.

+2

Dzięki, że tego nie wiedziałem. Ale moim głównym zmartwieniem są tablice z ponad 600-krotnymi indeksami, które są niedostępne. –

+0

Dodałem moje przemyślenia na ten temat do odpowiedzi. –

+1

Nigdy nie są zbierane przez cały czas trwania programu, co powoduje, że zastanawiamy się, do czego są wykorzystywane. Dobra teoria jednak :) –