Kiedy wywołujemy polecenie java za pomocą polecenia -cp, dostarczamy niektóre katalogi i pliki jar. Czy jvm wczytuje wszystkie klasy wymienione przez ścieżkę klasy Czy jest to po prostu super zestaw wszystkich klas, które jvm będzie ładowało się w razie potrzeby?Czy jvm wczytuje wszystkie klasy wymienione przez ścieżkę klas?
Odpowiedz
chce się załadować JVM wszystkich klas wymienionych przez ścieżce klasy A jest to tylko super zbiór wszystkich klas, które będą wyglądać JVM do ładowania, gdy wymagane ?
JVM ładuje klasy z danej klasy, w zależności od potrzeb, tzn. Po znalezieniu odnośnika dla klasy jest ładowana. Istnieje również hierarchia ładowań klas w JVM, klasa ładowana przez moduł ładujący klasy macierzystej jest używana przez ładowarki niższej klasy.
Napisałem prostą klasę HelloWorld, która nie importuje ani nie używa żadnego innego słoika innej firmy. Kiedy uruchomię to z "java -verbose: class HelloWorld", to widzę, że tyle klas z rt.jar jest ładowanych przez JVM. Nadal nie rozumiem dla klas core java ładowanych przez program ładujący Bootstrap. Czy wszystkie klasy zostały załadowane z pliku rt.jar? – hsingh
@hsingh JVM wymaga klas obecnych w rt.jar do ustawienia środowiska wykonawczego java. Nie jestem pewien, czy wszystkie klasy, ale z pewnością niektóre są ładowane z rt.jar –
Ładowanie klas odbywa się w kolejności i wygląda w lokalizacjach. -cp należy do trzeciej kategorii wymienionej poniżej. Zazwyczaj klasy aplikacji powinny być dostarczane za pośrednictwem -cp lub będą szukać zmiennej środowiskowej CLASSPATH.
Ramy rozszerzeń korzystają z mechanizmu delegowania klas. Gdy środowisko wykonawcze musi załadować nową klasę do wniosku, że wygląda dla klasy w następujących miejscach, w kolejności:
1) Bootstrap klasy: klas wykonania w rt.jar, zajęcia internacjonalizacji w i18n .jar i inne.
2) zainstalowanych rozszerzeń: klas w plikach JAR w katalogu lib/ext na JRE i na platformy określonego katalogu rozszerzeń całego systemu (na przykład/usr/jdk/packages/lib/ext w systemie operacyjnym Solaris ™, ale pamiętaj, że użycie tego katalogu dotyczy tylko Java ™ 6 i nowszych).
3) Ścieżka klas: klas, w tym klas w plikach JAR, na ścieżkach określonych przez właściwość systemową java.class.path. Jeśli plik JAR na ścieżce klasy ma manifest z atrybutem Class-Path, przeszukiwane będą również pliki JAR określone przez atrybut Class-Path. Domyślnie właściwość java.class.path ma wartość., Bieżący katalog. Możesz zmienić wartość, używając opcji wiersza poleceń -classpath lub -cp lub ustawiając zmienną środowiskową CLASSPATH. Opcje wiersza polecenia zastępują ustawienie zmiennej środowiskowej CLASSPATH.
https://docs.oracle.com/javase/tutorial/ext/basics/load.html
Więc '-cp' powoduje automatyczne ładowanie klas? – CKing
-cp jest ścieżką klas, pokazującą środowisku wykonawczemu ścieżkę, w której może znaleźć wymagane klasy, które nie znajdują się w dwóch pierwszych lokalizacjach (rt.jar i rozszerzenia). jeśli żądana klasa nie zostanie znaleziona w żadnej z trzech lokalizacji zakończy się wyjątkiem classnotfound – KDP
Pytanie nie dotyczy działania '-cp' ani sposobu w jaki klasy są wyszukiwane. Pytanie brzmi, czy klasy/słoiki wyszczególnione w '-cp' są ładowane automatycznie. Twoja odpowiedź wyjaśnia kolejność przeszukiwania klas. To nie jest to, o co poprosił PO. Jedyną częścią twojej odpowiedzi, która mówi o ładowaniu, jest * Ładowanie klasy następuje w kolejności *, która nie odpowiada na pytanie. – CKing
To nie ładuje wszystkie klasy, ale nie wie, gdzie ich szukać, gdy są potrzebne.
Zostaną załadowane, gdy będą potrzebne w pierwszej kolejności.
Istnieją dwie koncepcje zaangażowany
- ładowania
- inicjalizacji
Inicjowanie klasy zainicjuje pól i wykonać bloki statyczne. Dokładny moment, w którym tak się dzieje jest ważny dla semantyki aplikacji, dlatego jest to precisely defined.
Inicjalizacja wymaga najpierw załadowania; ale ładowanie jest bardziej wewnętrzną koncepcją JVM.JVM może i jest dozwolone, agresywnie preload klasy, nawet jeśli niepotrzebne. Ten proces nie wpływa na semantykę aplikacji i jest niewidoczny dla aplikacji.
Jeśli chodzi o wniosek, klasa musi zostać załadowana, jeśli otrzymamy obiekt o numerze Class
, np. od Foo.class
, Class.forName
lub innych interfejsów API do refleksji. Możemy zbadać właściwości Class
bez konieczności inicjowania inicjalizacji.
Jedno ważne ograniczenie - musimy uzyskać ten sam obiekt Class
dla tej samej nazwy klasy (i tego samego programu ładującego klasy). Obiekt Class
jest reprezentacją obciążonej klasy.
W odniesieniu do ostatniego punktu, nie sądzę, że obiekt "Class" ** potrzebuje **, aby był taki sam. Myślę, że to po prostu dobra praktyka dla implementacji. Musisz to znaleźć w JLS. –
Tak, [_ Podaj to samo imię, dobry program ładujący klasy powinien zawsze zwracać ten sam obiekt klasy.] (Http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html# jls-12.2) O ile się nie mylę. –
@SotiriosDelimanolis - nie dobry program ładujący klasy może nawet zwrócić nieprawidłowy obiekt klasy! Myślę, że zdanie oznacza, że ładunek klasy "legit" powinien zachowywać się w ten sposób. Istnieje wiele wzmianek o "* obiekcie klasy *" w JLS i javadocs, np. 'statyczna synchronizacja' działa na" obiekcie klasy "; nie ma większego sensu, jeśli mogą istnieć 2 obiekty klasy dla klasy. Poza tym 'Class' nie zastępuje' równa się' i jest mnóstwo kodu używając '==' bezpośrednio do sprawdzania równości klas, nawet w przykładach w JLS. – ZhongYu
- JVM ładuje tylko odwołuje zajęcia i nie każda klasa obecny w słoikach w ścieżce klas
- Ładowanie zajęć odbywa się poprzez sposób hierarchiczny
- zbyt wielu słoików w ścieżce klasy zajmuje tylko więcej miejsca na dysku
- JVM wykorzystuje tylko pamięć w pamięci fizycznej (RAM).
- 1. org.hibernate.QueryException: Nie wszystkie wymienione parametry zostały ustawione: []
- 2. Klasy udostępniania między maszynami JVM
- 3. Drukuj Wszystkie Flagi JVM
- 4. Programowo wykryć, czy JVM korzysta z dzielenia klas, czy nie?
- 5. Dlaczego niektóre opcje wywoływalne nie są wymienione przez funkcję dir()?
- 6. PHPExcel - wczytuje ostatni wiersz
- 7. Czy dokument XPathDocument wczytuje cały dokument XML?
- 8. Czy wiele procesów JVM może współużytkować pamięć dla wspólnych klas?
- 9. Czy jar aplikacji jest pobierany przez przeglądarkę lub przez JVM?
- 10. Jak skonfigurować dodatkową ścieżkę klas w SpringBoot?
- 11. Czy można uzyskać wszystkie podklasy klasy?
- 12. Gradle: jak ustawić ścieżkę klas konfiguracji JavaExec?
- 13. Klasy klas WinForm
- 14. VisualVM - Znajdź wszystkie odniesienia do klasy
- 15. Czy resharper generuje tostrings, który zawiera wszystkie właściwości klas?
- 16. Jak wyświetlić wszystkie właściwości klas?
- 17. Prowadzenie robota przez ścieżkę
- 18. Uzyskaj wszystkie odziedziczone klasy ogólnej klasy abstrakcyjnej
- 19. nie wszystkie wymienione parametry zostały ustawione hibernacji w createSQLQuery
- 20. Pobierz wszystkie aplikacje wymienione na stronie Google Play Developer Console
- 21. Domyślna implementacja JAXB języka Java jest wybierana przez moją ścieżkę klasy
- 22. ClassPathResource nie dostać ścieżkę klasy
- 23. Jak ustawić ścieżkę klas, gdy używam javax.tools.JavaCompiler kompilować źródło?
- 24. zdefiniowanie głównego ścieżkę klasy dla class.getResource()
- 25. Jak uzyskać wszystkie nazwy klas w pakiecie?
- 26. Jak usunąć wszystkie klasy za pomocą jQuery?
- 27. Jak wiele obiektów STRING zostanie stworzony przez wersję JVM 1.6
- 28. Czy można rejestrować, czy używana jest klasa w JVM?
- 29. Czy możesz przechodzić przez wszystkie przyciski opcji?
- 30. Jak znaleźć instancję klasy w działającej maszynie JVM
Tytuł zawiera słowo ClassLoader, ale twoje pytanie o tym nie wspomina. Czy zapomniałeś zadać część swojego pytania? – immibis
@immibis * Czy jvm wczytuje wszystkie klasy wymienione przez ścieżkę klasy * – CKing
Dzięki Chetan, zredagowałem pytanie. – hsingh