Java Classloader -Hierarchie verstehen
Der Kern des Lademechanismus der Java -Klasse ist die Hierarchie des Klassenladers und des übergeordneten Delegationsmodells. 1. Bootstrap Classloader ist für das Laden von JVM -Kernklassen verantwortlich. 2. Erweiterungsklassenloader lädt die Java -Erweiterungsklassenbibliothek; A. Anwendungsklassenloader lädt Klassen auf dem Anwendungsklassenpfad. Die Klassenbelastung folgt dem übergeordneten Delegationsmodell, dh, dass Klassenladeanforderungen zuerst an den übergeordneten Klassenlader delegiert werden, und Unterklassen versuchen nur zu laden, wenn die übergeordnete Klasse nicht geladen werden kann, um das doppelte Laden von Klassen zu vermeiden und Sicherheit zu gewährleisten. Benutzerdefinierte Klassenlader können in Hot Deployment, modulares Laden und anderen Szenarien verwendet werden. Sie erben normalerweise den Klassenloader und überschreiben die FindClass () -Methode. Wenn Sie die übergeordnete Delegation durchbrechen müssen, können Sie LoadClass () überschreiben. Darüber hinaus implementieren Klassenlader Klassenisolation in Webcontainern, und Thread -Kontextklassenlader werden für bestimmte Szenarien wie das Laden von JDBC -Treibern verwendet. Das Verständnis des Klassenlastmechanismus hilft bei der Fehlerbehebung von Konflikten für Klassen, der Optimierung von Plug-in-Systemen und Lösungen für Hot Deployment.
Der Klassenladermechanismus von Java ist ein sehr zentraler Bestandteil des JVM, und die Hierarchie des Klassenladers (Klasseloader) ist der Schlüssel. Das Verständnis der hierarchischen Beziehung des Klassenloaders kann dabei helfen, Probleme mit Klassenbeladen zu beheben, Klassenkonflikte zu vermeiden und bei der Entwicklung von Plug-in-Systemen oder Hot-Bereitstellungslösungen sogar nützlich zu sein.

Die drei Hauptrollen des Java -Klassenloaders
Es gibt nicht nur einen Klassenlader in Java, sondern auch drei Hauptlader der Hauptlader, die eine Eltern-Kind-Hierarchie bilden:
- Bootstrap Classloader : Ist dafür verantwortlich, die mit dem JVM gelieferten Kernklassen wie
java.lang.Object
zu laden, die sich normalerweise inrt.jar
befinden. Es wird von C implementiert, keine Java -Klasse. - Erweiterungsklassenloader : Die Erweiterungsklassenbibliothek, die für das Laden von Java verantwortlich ist, das sich im Allgemeinen im
jre/lib/ext
-Verzeichnis befindet, oder dem vonjava.ext.dirs
angegebenen Ort. - Anwendungsklassenloader (auch als System Classloader bezeichnet) : ist für das Laden von Klassen auf dem Anwendungsklassenpfad verantwortlich und ist der Klassenloader, mit dem wir am häufigsten zu tun haben.
Zwischen diesen drei Klassenladern bildet sich eine "baumartige" Struktur. Bootstrap ist der Stammknoten, die Erweiterung ist sein untergeordneter Knoten und die Anwendung ist auch der untergeordnete Knoten der Erweiterung.

Wie funktioniert das übergeordnete Delegationsmodell?
Das Laden der Java -Klasse folgt einem Mechanismus, der als "übergeordnetes Delegationsmodell" bezeichnet wird. Einfach ausgedrückt, wenn ein Klassenlader eine Anforderung zum Laden einer Klasse erhält, lädt er sie erst zuerst, sondern delegiert die Anforderung an den übergeordneten Klassenlader, um sie bis zum obersten Bootstrap-Klassenloader zu vervollständigen.
Der aktuelle Klassenlader versucht nur zu laden, wenn der übergeordnete Klassenlader die Ladeaufgabe nicht ausführen kann (z. B. nicht die entsprechende Klasse finden).

Es gibt zwei Hauptvorteile dieses Mechanismus:
- Vermeiden Sie doppelte Klassenbelastung: Die gleiche Klasse wird nur einmal geladen und wird von so möglichst erweiterten Klassenladern durchgeführt.
- Stellen Sie die Sicherheit der Klasse sicher: Verhindern Sie, dass Benutzer Klassen in der Kernklassenbibliothek ausgeben. Zum Beispiel haben Sie eine
java.lang.String
geschrieben, aber aufgrund der Existenz einer übergeordneten Delegation priorisiert der JVM die Verwendung von Bootstrap -Ladeversion, um Sicherheitsrisiken zu vermeiden.
Zum Beispiel: Wenn Sie in Ihrem Code new String()
verwenden, lädt der JVM java.lang.String
über den Anwendungsklassenloader, aber es wird die Aufgabe aus erster Hand in den Klassenloader der übergeordneten Klassenerweiterung und dann an den Bootstrap -Klassenloader übergeben. Schließlich lud Bootstrap diese Klasse erfolgreich von RT.Jar aus, und der gesamte Prozess endete.
Gemeinsame Verwendungen und Vorsichtsmaßnahmen für benutzerdefinierte Klassenlader
Manchmal müssen wir Classloader anpassen, z. B. die Implementierung von Hot Deployment, modulares Laden, verschlüsselte Klassendateien usw. Die Methode für die modische Klassenlader erben im Allgemeinen java.lang.ClassLoader
und Override findClass()
.
Es ist zu beachten, dass, wenn Sie dem übergeordneten Delegationsmodell folgen möchten, loadClass()
-Methode nicht beiläufig neu schreiben. Wenn Sie dieses Modell (z. B. OSGI oder einige Hot -Update -Frameworks) brechen möchten, können Sie Ihre eigene Ladelogik durch Umschreiben von loadClass()
implementieren.
Mehrere wichtige Punkte:
- Wenn Sie die Klassenisolation implementieren möchten (z. B. verschiedene Module laden ihre jeweiligen Klassen, ohne sich zu stören), müssen Sie die Beziehung zwischen Klassenladern entwerfen.
- In einem Webcontainer (z. B. Tomcat) verfügt jede Webanwendung über einen eigenen Klassenlader, wodurch Klassenkonflikte zwischen verschiedenen Anwendungen vermieden werden können.
- Verwenden Sie den Thread Context Classloader, um die Standardklassen -Loaderkette in einigen Szenarien zu umgehen, z. B. beim Laden wird der JDBC -Treiber verwendet.
Lassen Sie uns zusammenfassen
Die Hierarchie des Klassenladers und der übergeordneten Delegationsmechanismus ist eine der wichtigsten Grundlagen der Java -Plattform. Obwohl wir den Klassenloader nicht direkt betreiben müssen, kann es uns helfen, diesen Mechanismus zu verstehen, wenn wir Probleme schneller auf Probleme wie Klassenbeladungsausnahmen und Klassenkonflikte aufnehmen. Gleichzeitig kann in einigen erweiterten Anwendungsszenarien auch der rationale Einsatz des Klassenlastmechanismus Flexibilität und Skalierbarkeit bringen.
Grundsätzlich ist alles, nicht kompliziert, aber es ist leicht, Details zu ignorieren.
Das obige ist der detaillierte Inhalt vonJava Classloader -Hierarchie verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Virtuelle Threads haben erhebliche Leistungsvorteile in hochverträglichen und io-intensiven Szenarien, aber den Testmethoden und anwendbaren Szenarien sollten Aufmerksamkeit geschenkt werden. 1. Richtige Tests sollten das echte Geschäft simulieren, insbesondere IO -Blockierungsszenarien, und verwenden Tools wie JMH oder Gatling, um Plattform -Threads zu vergleichen. 2. Die Durchsatzlücke ist offensichtlich und kann mehrmals bis zehnmal mehr als 100.000 gleichzeitige Anfragen sein, da sie leichter und effizienter Planung ist. 3. Während des Tests ist es notwendig, vermeiden, hohe Parallelitätszahlen blind zu verfolgen, sich an nicht blockierende IO-Modelle anzupassen und die Überwachungsindikatoren wie Latenz und GC zu beachten. 4. In den tatsächlichen Anwendungen eignet es sich für Web-Backends, asynchrone Aufgabenverarbeitung und eine große Anzahl gleichzeitiger IO-Szenarien, während CPU-intensive Aufgaben immer noch für Plattform-Threads oder Forkjoinpool geeignet sind.

Servicemesh ist eine unvermeidliche Wahl für die Entwicklung der Java Microservice -Architektur, und der Kern liegt in der Entkopplung der Netzwerklogik und der Geschäftsordnung. 1. Servicemesh verarbeitet Lastausgleich, Sicherung, Überwachung und andere Funktionen durch SIDECAR -Agenten, um sich auf das Geschäft zu konzentrieren. 2. Istio Gesandt ist für mittlere und große Projekte geeignet, und Linkerd ist leichter und für kleine Versuche geeignet. 3.. Java Microservices sollten vor Vieren, Band und anderen Komponenten schließen und sie für Entdeckung und Kommunikation an ISTIOD übergeben. 4. Stellen Sie die automatische Injektion von Sidecar während der Bereitstellung sicher, achten Sie auf die Konfiguration der Verkehrsregeln, die Protokollkompatibilität und die Konstruktion von Protokollverfolgungssystemen und übernehmen Sie die Planung der inkrementellen Migration und der Planung der Vorkontrolle.

Um JDBC -Transaktionen korrekt zu verarbeiten, müssen Sie zunächst den automatischen Komiti -Modus ausschalten und dann mehrere Vorgänge ausführen und schließlich entsprechend den Ergebnissen festlegen oder rollen. 1. Nennen Sie Conn.SetAutoCommit (False), um die Transaktion zu starten. 2. Führen Sie mehrere SQL -Operationen aus, z. B. einfügen und aktualisieren. 3. Rufen Sie Conn.Commit () an, wenn alle Vorgänge erfolgreich sind, und rufen Sie Conn.Rollback () auf, wenn eine Ausnahme auftritt, um die Datenkonsistenz zu gewährleisten. Gleichzeitig sollten Try-with-Ressourcen verwendet werden, um Ressourcen zu verwalten, Ausnahmen ordnungsgemäß zu behandeln und Verbindungen zu schließen, um Verbindungsleckage zu vermeiden. Darüber hinaus wird empfohlen, Verbindungspools zu verwenden und Save -Punkte zu setzen, um teilweise Rollback zu erreichen und Transaktionen so kurz wie möglich zu halten, um die Leistung zu verbessern.

Abhängigkeitsinjektion (DI) IsAdeSnIntWhereObjectSRecedEpendencieSexternally, PromotingLoosecoubingAneAtReTingThroughConstructor, Setter, Orfieldinjection.2springFrameworkuSaSNotations-@-Komponenten,@Service und@autowiredWithjava-basierte Konfitation

Pre-Formancetartuptimemoryusage, QuarkusandmicronautleadduToCompile-Time-foringandgraalvSupport, WithQuarkusofttenperformLightBetterin serverloser Szenarien.2. Thyvelopecosystem,

Setupamaven/GradleProjectWithjax-rsdependencies-ähnlich Jersey; 2. CreatearestresourcEUntationSuchas@pathand@Get; 3.ConfiguretheApplicationviaApplicationSubclitsorweb.xml;

Verwenden Sie Klassen im Java.Time -Paket, um das alte Datum und die Kalenderklassen zu ersetzen. 2. Erhalten Sie das aktuelle Datum und die aktuelle Uhrzeit durch LocalDate, LocalDatetime und Local Time; 3. Erstellen Sie ein bestimmtes Datum und eine bestimmte Uhrzeit mit der von () Methode; 4.. Verwenden Sie die Plus/Minus -Methode, um die Zeit nicht zu erhöhen und zu verkürzen. 5. Verwenden Sie ZonedDatetime und zoneId, um die Zeitzone zu verarbeiten. 6. Format und analysieren Sie Datumszeichenfolgen über DateTimeFormatter; 7. Verwenden Sie sofortige, um bei Bedarf mit den alten Datumstypen kompatibel zu sein. Die Verarbeitung der Datum in der modernen Java sollte der Verwendung von Java.Timeapi vorrangig machen, was klare, unveränderliche und linear ist

Verwenden Sie Leistungsanalyse-Tools, um Engpässe zu lokalisieren, VisualVM oder JProfiler in der Entwicklung und Testphase zu verwenden und Async-Profiler in der Produktionsumgebung Priorität zu geben. 2. Reduzieren Sie die Objekterstellung, verwenden Sie Objekte wieder, verwenden Sie StringBuilder, um String -Spleißen zu ersetzen und entsprechende GC -Strategien auszuwählen. 3.. Optimieren Sie die Auswahl der Sammlung, wählen Sie die Anfangskapazität gemäß der Szene aus; V. 5. Tune JVM-Parameter, festlegen, angemessene Haufengröße und Müllsammler mit geringer Latenz einstellen und GC-Protokolle aktivieren; 6. Vermeiden Sie die Reflexion auf Codeebene, ersetzen Sie Wrapper -Klassen durch Grundtypen, Verzögerungsinitialisierung und verwenden Sie endgültige und statische. 7. Kontinuierliche Leistungstest und Überwachung, kombiniert mit JMH
