2012-12-18 19 views
6

Ostatnio zostały dotknięte classloaders Java i nagle uznał, że nie w pełni zrozumieć, co się dzieje krok po kroku gdy ktoś dzwoniCo się stanie, gdy uruchomi się program java?

java -jar App.jar 

No Chyba

  1. nowa instancja JVM jest utworzony
  2. wykorzystuje ClassLoader do załadowania klasy głównej i innych klas
  3. kod bajtowy jest uruchamiany z metody main()

Ale nadal sądzę, że jest wiele rzeczy, które muszę wiedzieć o tym więcej.

  • Kto i jak decyduje, które klasy należy załadować przy starcie, a które w razie potrzeby?

Znalazłem dwa powiązane pytania, ale tam nie jest wyjaśnione, jak zastosować to do rzeczywistości Java.

What happens when a computer program runs?

What happens when you run a program?

+1

Specyfikacja może pomóc (albiet nieco tępy, dlatego komentarz nie jest odpowiedzią): http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.1 – Charlie

+0

Również ten odsyłacz odnosi się do specyfikacji VM Java: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.2 – Charlie

Odpowiedz

2

• Kto i jak decyduje, które ćwiczenia powinny być ładowane przy starcie, a które kiedyś potrzebne?

musimy zrozumieć podstawy klasy java załadunku. Początkowo bootloader classloader (jest implementowany natywnie jako część samej maszyny wirtualnej) jest odpowiedzialny za ładowanie klas systemowych. Istnieją również inne programy ładujące klasy, takie jak Extension, system, zdefiniowane przez użytkownika (opcjonalne) ładowniki klas, które decydują o tym, kiedy i jak należy ładować klasy. Fundamentals of class loading

1

Decyzja jest podejmowana przez moduł ładujący klasy. Istnieją różne implementacje, z których niektóre wstępnie ładują wszystkie klasy, które mogą i niektóre tylko ładują klasy, ponieważ są one potrzebne.

Tylko klasa potrzebuje do załadowania, gdy jest uzyskiwany dostęp z kodu programu po raz pierwszy; dostęp ten może być instancją obiektu z tej klasy lub dostępem do jednego z jego członków static. Zwykle domyślny program ładujący klasy ładuje leniwie klasy, gdy są one potrzebne.

Niektóre klasy nie mogą być używane do wstępnego załadowania w każdym przypadku jednak: Klasy dostępne przez Class.forName(...) mogą nie zostać określone, dopóki ten kod nie zostanie faktycznie sprawdzony.

Wśród innych opcji, w przypadku prostych eksperymentów można użyć statycznego kodu inicjalizatora, aby sprawdzić aktualny czas i kolejność, w której klasy są faktycznie ładowane; ten kod zostanie wykonany, gdy klasa zostanie załadowana po raz pierwszy; Przykład:

class SomeClass { 

    static { 
     System.out.println("Class SomeClass was initialized."); 
    } 

    public SomeClass() { 
     ... 
    } 

    ... 

} 
0

Twój przykład pokazuje wykonywalny słoik, który jest po prostu normalnym archiwum Java (jar) z dodatkową parę klucz/wartość w to plik manifestu (znajduje się w folderze "META_INF").Kluczem jest "Main-Class" oraz wartość w pełni kwalifikowanej nazwy klasy tej klasy, której "główna" metoda zostanie wykonana, jeśli "uruchomisz" słoik, tak jak w twoim przykładzie.

Słoik to plik zip i możesz zajrzeć do środka za pomocą każdego narzędzia archiwizacji zip.

0

Kiedykolwiek skompilować program Java następujące czynności odbywa

  1. najpierw Loader Klasa ładuje klasę na JVM.
  2. Po wydaniu polecenia javac filename.java kompilator sprawdza błędy kompilacji i jeśli wszystko jest w porządku, wygeneruje pliki .Class (kod bajtowy).

To będzie pierwszy etap.

Później interpreter sprawdza błędy środowiska wykonawczego i jeśli wszystko jest w porządku bez wyjątków, to interpreter konwertuje kod bajtowy na kod wykonywalny.

Pierwsza faza java jest wykonywana przez kompilator JIT (Just In Time).

Powiązane problemy