notes d'étude JV

Chapitre Introduction
Les principaux contenus de la machine virtuelle Java , comprenant:
la structure interne d'une machine virtuelle;
2, type de code d'octet et de la fonction des machines virtuelles;
3, la structure de fichier de classe;
4, le chargement de la classe et la connexion initialisation

Le deuxième chapitre, la structure de la machine virtuelle
structure de base de la machine virtuelle comprend: un système de chargement de classe, la zone de procédé, tas, pile java, des piles de méthode natifs, les registres de PC, direct à la mémoire, le système de collecte des ordures, le moteur d'exécution.
processus java Utilisation: java [-options] classe [args ...]
paramètre options indique le début,
args représente le transfert des principaux paramètres fonction main ()

tas java dans une nouvelle ère et l'ancienne époque.
Ans: les deux tiers de l'espace de tas de
la jeune génération: un tiers du tas
nouvelle ère est divisé en région eden, zone s0, zone s1, et s0 s1 sont deux espace mémoire de taille égale, interchangeable.
district eden: l'espace jeune génération 8/10
de survivor0: l'espace jeune génération 1/10
survivor1: 1/10 de l'espace jeune génération

Dans la plupart des cas, l'objet est d'abord affecté à la zone eden, après une nouvelle génération de recyclage à travers, si l'objet est encore en vie, entrera en s0 ou s1, une fois après chaque nouvelle génération de recyclage, les objets vivants, est incrémentée âge où le cours de l'âge un certain nombre, seront considérés comme des sujets âgés, dans l'ancienne époque.

java contenu est stocké dans la pile de cadre de pile, et à chaque fois qu'il est enfoncé dans un cadre de pile d'appel de fonction, la fin de la fonction apparaît un cadre de pile.
Un cadre de pile doit contenir au moins le tableau de variable locale et les données de trame opérande pile.
Opérande pile est utilisé pour contenir les résultats intermédiaires de calculs.

Le troisième chapitre, réglage du paramètre
-XX: + PrintFlagsFinal Voir tous les paramètres par défaut jvm
-Xss 128k pile espace est réglé
-XX: + PrintGC impression log collecte des ordures
mémoire -Xmx 10m tas maximum
-Xms tas minimum de 10 m
-XX: + PrintGCDetails Imprimer journal détails
-XX: InitialSurvivorRatio = 8 nouvelle génération d'Eden / rapport initial de l' espace Survivor
-XX: Newratio = rapport de surface de mémoire de 2 ans et les zones Cénozoïque
-XX: MetaspaceSize = 512M espace initial, cette valeur est atteinte déclenchera le spam recueillir le déchargement de type en GC ajustera la valeur: si la libération d'une grande quantité d'espace, il convient de réduire la valeur, si elle était libérée très peu d' espace, donc lorsqu'il n'y a plus de MaxMetaspaceSize, une augmentation appropriée de la valeur.
-XX: MaxMetaspaceSize = 512M taille maximale, valeur par défaut est pas de limitation
-XX: MinMetaspaceFreeRatio, après la GC, le pourcentage le plus faible capacité Metaspace d'espace libre, ce qui réduit l'espace alloué pour la collecte des ordures a causé
-XX: MaxMetaspaceFreeRatio, après la GC, Metaspace pourcentage restant du montant maximum de l' espace, un espace pour la libération de la réduction de la collecte des ordures a causé
-XX: + PrintHeapAtGC sortie du journal avant et après le GC tas
-XX: sortie + de PrintGCTimeStamps GC GC se produit lorsque le temps d'apparition
-XX: + TraceClassLoading suivi de classe charge
-XX: + PringVMOptions commande d'impression en ligne a reçu paramètre explicite
-XX: + paramètres explicites et implicites PringCommandLineFlags commande d' impression accepté la
pratique peut être égale -Xmx et -Xms.
ensemble -Xmn 10 m une nouvelle génération de mémoire
-XX: + Exporter un message d'erreur de débordement de mémoire HeapDumpOnOutOfMemoryError lorsque
-XX: HeapDumpPath = d: chemin de stockage /a.dump
-XX: MaxDirectMemorySize plus direct à la mémoire, si vous ne définissez pas l'espace de tas maximum par défaut, directe la collecte des déchets est déclenchée lorsque la mémoire atteint la valeur définie
-Xloggc: journal de collecte des ordures /path/gc.log

-XX: + UseSerialGC préciser l'utilisation de la nouvelle génération et l'ancien collecteur de collecteur de série série
-XX: + UseParNewGC utilisation ParNew nouvelle génération et l'ancien collecteur de série collector
-XX: + UseParallelGC nouvelle génération de recyclage utilisation ParallelGC ans et utiliser le collecteur de série
-XX: + UseParallelOldGC utilisation ParallelGC nouvelle génération et l'ancienne utilisation du collecteur collecteur ParallelOldGC
de -XX: + UseConcMarkSweepGC nouvelle génération de recyclage et l'utilisation de ParNew ans l' utilisation du collecteur CMS
-XX: + UseG1GC utilisation collecteur G1
-XX: MaxTenuringThreshold = 15 fois promu la nouvelle génération de la vieillesse
-XX: ParallelGCThreads fils de collecte des ordures

Le quatrième chapitre, le concept d'algorithmes de collecte des ordures et
comptage de référence, marque algorithme de compression, des algorithmes d'étiquetage claires, des algorithmes et copier génération, partition idéologique.
Le plus grand inconvénient de l' algorithme marqué des débris spatiaux est clair
la mémoire de l' algorithme de copie en deux, l' un d'entre eux utilise seulement. Rarement besoin de copier des objets en direct. L'inconvénient est que la mémoire utilisée doit être divisée en deux.
algorithme de compression Mark est un algorithme ans vieux, en plus de marquer l' élimination des défauts de l' algorithme de débris spatiaux.
algorithme de génération en fonction des caractéristiques de l'objet de mémoire en morceaux, en utilisant différents algorithmes de récupération de, améliorer l'efficacité du recyclage.
L'espace de tas d'algorithme de partitionnement est divisé en différents espaces successifs petits, chaque petit espace est utilisé indépendamment, le recyclage indépendant, vous pouvez contrôler la quantité d' espace une petite reprise.

objets ordures critères est inaccessible.
Palpable comprend trois états: 1, accessibilité: à partir de la racine, pour atteindre l'objet;
2. résurrection Can: les références d'objets sont libérés, mais l'objet peut finaliser () résurrection,
3, inaccessible: finaliser l'objet () il a été appelé, et il n'y a pas de résurrection, dans l' état inaccessible.
Lorsque des objets inaccessibles peuvent être recyclés.

Quatre niveaux de référence: de fortes références, doux, faibles, et les références fantômes citées.
Une forte référence à l'objet d'être accessible, non recyclé. Doux, faibles, et les références fantômes citées dans certaines conditions peuvent être recyclés.

références souples seront recyclés lorsque le manque d'espace de tas,
références faibles juste pour être trouvé, il sera recyclé,
référence fantôme peut être récupéré à tout moment, doit être utilisé conjointement avec une file d' attente de référence, principalement utilisé pour suivre le processus de collecte des ordures.
processus de collecte des ordures, l'application un coup d' arrêt, il n'y aura pas de réponse, également connu sous le STW.

Chapitre V, l' allocation de mémoire et éboueur
Type de garbage collector: série de collecte des ordures, garbage collector parallèle, collecteur CMS, collecteur G1.
Il fait référence à la collecte des ordures de collecteur de collecteur de série de fil unique. Caractérisé par un seul thread, exclusif. Lorsque la collecte des ordures, les fils ont besoin de faire une pause.
La nouvelle génération de garbage collector série en utilisant l'algorithme de copie.
garbage collector série de vieux en utilisant un algorithme de compression de marqueur.

garbage collector parallèle sur la base de l'amélioration de série, une pluralité de fils pour la collecte des ordures ménagères.
collecteur ParNew: une nouvelle génération, l' utilisation de recyclage multi-threading, garbage collector parallèle.
collecteur ParallelGC: une nouvelle génération, l' utilisation de recyclage multi-threading, garbage collector parallèle. Mise au point sur le système débit de
récupération ParallelOldGC: pour les anciens temps, en utilisant plusieurs threads pour le recyclage, éboueur parallèle, le débit du système d'attention.

collecteur CMS: collecteur parallèle multi-thread, préoccupé par les pauses du système. Les étapes sont les suivantes: drapeau initial (drapeau objet racine), marque concurrente (marquer tous les objets), prélavage, réétiqueté, purge simultanée, remise à zéro simultanée. Le marquage initial et re-marquage est occupé par des ressources du système, d'autres utilisateurs peuvent effectuer ensemble et fil.

Collecteur G1: appartenance collecteur générationnel, un algorithme de partitionnement utilisé, les caractéristiques de la simultanéité, le parallélisme, la génération de GC, l' espace de finition, la prévisibilité.
processus de collecte comporte quatre phases: la nouvelle génération GC, période de marque concurrente, mixte recueillie, est susceptible de continuer FullGC.
Si l'objet est grande, la nouvelle génération ne correspond pas directement dans l'ancienne époque.

Chapitre X, système de chargement de classe
charge du système peut être divisé en chargement de fichiers, de connectivité et de l' initialisation. Quelle connexion est divisée en vérification, la préparation et la résolution.
Classe ne sera chargée au moment qui doit être utilisé, la machine virtuelle fournit une classe ou d'une interface doit être initialisé avant utilisation, utiliser ici fait référence à l'utilisation de l'initiative, l'initiative d'utiliser l' une des situations suivantes:
1, créer une instance d'une classe,
2, statiques appels de méthodes de classes;
; 3, classe ou interface en utilisant des champs de statiques (modifié exclu final)
classe 4, méthode main ()

Lorsque la classe est chargée, la machine virtuelle procédez comme suit: 1, par le nom complet, acquis classe flux binaire de classe; 2, la méthode d'analyse de flux binaire de la structure de classe de la zone de données, 3, créez une instance de classe de classe de
classe de vérification: Format vérification, vérification sémantique, la vérification de bytecode et la vérification des références symboliques.
Préparation: allouer l' espace mémoire pour la classe, et définissez la valeur initiale.
Analyse: Les classes de symboles, des interfaces, des champs et des méthodes de référence en référence directe.
Initialisation: méthode d'initialisation de la classe d'exécution

Machine virtuelle Java a créé trois catégories classLoader respectivement BootStrap ClassLoader, Extension ClassLoader, App ClassLoader .
Pour déterminer si un chargeur de classe, l'application suivra le chemin du chargeur de classe parent le jugement jusqu'à ce que le chargeur de classe de démarrage. L'inconvénient est toploader de classe ne peut pas accéder au chargeur de classe sous - jacente pour charger une classe.

Chapitre VIII, verrous, et en même temps des
mesures pour protéger les ressources de verrouillage région critiques ne seront pas accès multiple threads et les dommages.
Les objets stockés dans la mise en mémoire peut être divisée en trois zones: en- tête d'objet ( En- tête), les données d'instance (instance de données) et remplissage d'alignement (le bourrage)
d' en- tête d'objet (objet en- tête) comprend deux éléments d'information, une première partie pour stocker des objets eux - mêmes les données d'exécution, tels que le code de hachage (hashCode), le fil GC génération de drapeau d'état de verrouillage de l' âge détient le verrou, l'ID de déviation de fil, estampille temporelle, etc. polarisation, cette partie de la longueur des données à 32 bits et 64 bits une machine virtuelle (pas considérer le pointeur de scène ouverte comprimé), respectivement, de 32 et 64 bits, appelé officiellement « la marque verbale ».
Une autre partie du type de pointeur d' en- tête d'objet, à savoir que ce sont les points d'objet au pointeur de métadonnées de classe, la machine virtuelle est déterminée par le pointeur qui est une instance de la classe d'objet. Pas toutes les implémentations de machines virtuelles doivent conserver le type de pointeur de données sur l'objet, autrement dit de trouver l'objet de métadonnées n'a pas à passer par l'objet lui - même. En outre, si l'objet est un tableau Java, en ce que l'objet doit avoir une tête pour enregistrer la longueur de données de la matrice, parce que la machine virtuelle peut déterminer la taille de l'objet Java par les informations de métadonnées des objets Java ordinaire, mais les méta - données à partir du réseau vous ne pouvez pas déterminer la taille du tableau.
Il y a quatre états de la serrure: pas de statut de verrouillage, ont tendance à verrouiller, serrure de verrouillage léger et poids lourd. Avec le verrou de la compétition, vous pouvez passer d' une butée à verrouillage biaisé léger, puis la mise à niveau de verrouillage des poids lourds (verrouillage mais la mise à niveau est unidirectionnel, c'est - à - dire que la mise à niveau de bas en haut, le verrou n'apparaîtra déclassement).

Exemples de données: réel banque d' informations valables, à savoir, les différents types de contenu du champ de code de programme défini, y compris la classe parente héritée et la définition de la sous - classe.
Pas de blocage (001)
biaisé verrou (101)
verrouillage léger (00)
verrouillage des poids lourds (10) en-
tête d'objet est constitué des trois éléments suivants: Word Mark, un pointeur vers la classe, la longueur du tableau (un tableau d'objets ont seulement)
le général JVM donc en utilisant les serrures et marquer Word: 1. lorsqu'ils ne sont pas comme un verrou, qui est un objet ordinaire, la marque verbale objet record HashCode, drapeau de verrouillage est 01, que ce soit celui qui est biaisé verrouillage 0.

2, lorsque l'objet est traité comme verrou de synchronisation et il y a un fil Un grappin de la serrure, l'indicateur de verrouillage est toujours 01, mais si cette tendance à enfermer dans un 1 avant l'identifiant de fil d'enregistrement à 23bit saisir le verrouillage, qui pénètrent dans l'état de verrouillage polarisé .

3, lorsque le fil A nouveau en essayant d'obtenir un verrou, JVM trouvé que les objets de verrouillage de synchronisation de drapeau est 01, si le verrouillage biaisé ou non 1, qui est poussé vers l'état, l'identifiant du fil marque verbale enregistrée dans ce thread A propre id, indique que le fil un a gagné ce verrouillage biaisé, le code de verrouillage de synchronisation peut être exécutée.

4, lorsque les tentatives fil B pour obtenir le verrou, JVM a trouvé le verrou de synchronisation est biaisé vers l'état, mais le mot Mark dans le dossier d'identification de fil est pas B, puis enfilez B utilisera d'abord l'opération de CAS en essayant d'obtenir un verrou, où pour obtenir l'opération de verrouillage est de chances de réussir, parce que le fil une libération générale ne verrouillage biaisé pas automatiquement. Si vous prenez le verrou est réussi, mettre la marque verbale dans le fil id id fil B à la place, au nom de fils de biais B gagné ce verrou, vous pouvez effectuer le code de verrouillage de synchronisation. Si vous prenez le verrou échoue, passez à l'étape 5.

5, état de verrouillage biaisé n'a pas réussi à saisir la serrure, au nom de la serrure actuelle a une certaine concurrence, sera mis à jour à verrouillage de verrouillage biaisé léger. La pile JVM du fil courant à l'air libre du fil dans un espace séparé, ce qui maintient le verrou pointeur d'objet pointant Mark Word, tout en conservant un pointeur vers un objet dans cet espace dans la serrure Mot Mark. si la sauvegarde est réussie, au nom de la serrure de la synchronisation des threads attrapée, lui drapeau de verrouillage Mark a été changé dans Word 00, les deux opérations sont enregistrées opération CAS, vous pouvez effectuer le code de verrouillage de synchronisation. Si la sauvegarde échoue, ce qui indique saisir l'échec de verrouillage, trop de concurrence, passez à l'étape 6.

6, saisir de défaillance de verrouillage de verrouillage léger, machine virtuelle Java utilise des verrous de spin, lock spinlock est pas un état, mais les représentants continuent de réessayer, essayer de prendre un verrou. De JDK1.7 début, verrouillage de rotation est activé par défaut, la fréquence de rotation est déterminée par la machine virtuelle Java. Si grab de verrouillage de verrouillage de synchronisation réussie, le code est exécuté, et si cela échoue passez à l'étape 7.

7, après la nouvelle tentative de spin-lock si toujours pas à saisir le verrou, le verrou sera mis à niveau à verrouillage de synchronisation poids lourds, le drapeau de verrouillage est changé en 10. Dans cet état, le verrou ne pas saisir le fil sera bloqué.

Rembourrage Alignement: JVM nécessite des objets Java représentant la taille de la mémoire doit être un multiple de 8 bits, l'origine de plusieurs octets pour la taille de l'objet est rembourré à un multiple de 8 bits, aucune fonction particulière.

système 32 bits, le premier objet cible comme suit: 25bit désigne une valeur de hachage d'un objet, l'objet 4bit représente l'âge, exprimé 1bit de verrouillage sollicité, des informations de 2bit indique la serrure.
Insérer ici l'image Description
La figure montre un format de l' en- tête d'objet dans des circonstances différentes.

Optimisation des verrous au niveau de l'application: 1, pour réduire le temps de maintien de la serrure; 2, ce qui réduit la granularité de verrouillage; 3, verrouillage séparé

CAS: comparer et algorithme de remplacement, variable contient trois paramètres à jour, la valeur attendue, la nouvelle valeur

modèle Java mémoire est construit autour d' atomicité de programmation concurrente, la visibilité, la commande de ces trois caractéristiques à construire.
L'objectif principal des règles d'accès au programme de modèle de mémoire Java défini pour chaque variable, à savoir, stockée dans la mémoire et les détails sous - jacents de variables telles retirées de la mémoire dans la machine virtuelle Java variable.
JMM fournit toutes les variables sont stockées dans la mémoire principale (mémoire principale) dans. Chaque thread a aussi sa propre mémoire de travail (mémoire de travail), le fil de la mémoire de travail est enregistré dans la mémoire principale d'une copie d'une copie du fil variables utilisées, et le fil de toutes les opérations sur les variables (lecture, travaux, etc.) doivent être pour la mémoire de travail, et ne pas lire directement et écrire les principales variables dans la mémoire (variables volatile a encore une copie de la mémoire de travail, mais en raison de sa séquence prédéterminée spéciale d'opérations, il semble que lire directement et accès en écriture dans la mémoire principale en général). Entre les différents threads ne peuvent pas accéder directement à la mémoire de travail des autres variables, les valeurs sont passées entre les fils doivent être faites par la mémoire principale.

relation d'ordre entre deux opérations définies dans le modèle de mémoire Java, si le fonctionnement se produit dans la première opération A B, peut affecter le fonctionnement de l'opération A B produite a été observée.
se passe-avant principes:
1, les règles de déroulement du programme (Pragram ordre Règle): dans un fil, selon un ordre de programme du livre de code opération d'écriture de EDITORIAL se produit après la première opération.
2, des règles variables volatiles (règle Variable volatile): écriture à une variable volatile précède le visage de cette variable opération de lecture a lieu
3, les règles de verrouillage (moniteur de verrouillage Règle): Après une première opération de déverrouillage se produit en face du même une opération de verrouillage de la serrure. Ici , il faut souligner que le même verrou, et « retour » fait référence à l'ordre dans le temps.
4, transitivité (transitivité): Si la procédure précédente A dans la procédure B se produit, le fonctionnement se produit dans la première opération B C, il peut être conclu que l'opération A est C opération d'avance se produit.
5, la règle de démarrage (filetage Démarrer la règle): Méthode première action commencer objet Thread () dans ce fil pour chaque occurrence.
6, le fil règle enfin (filetage Résiliation règle): Toutes les opérations sont en avance sur la fin des threads se produit dans la détection de ce fil, nous pouvons mettre fin par la méthode Thread.join (), Thread.isAlive () valeur de retour, etc. pour le segment de détection le filetage est terminé.
7, les règles de rupture de fil (filetage Interruption Règle): méthode d' appel d'interruption du fil () est déroulé dans la détection du code à filetage interrompu événement d' interruption se produit.
tout mesure de sécurité doit prévaloir en même temps se-avant principe.

Chapitre IX, la structure de fichier de classe
fichier de classe est un flux binaire à un ensemble de base d' une unité de 8 octets, chacun des éléments de données sont disposées dans l'ordre exact dans le fichier de classe compact, sans séparation intermédiaire, ce qui rend le contenu stocké dans le fichier de classe presque tous les programmes en cours d' exécution. Cette structure seulement deux types de données: non signés et des tables.
Somme: fixer la valeur 0xCAFEBABE
version minimale: minor_version
Version maximale: major_version
compteurs de pool de constantes: constant_pool_count
piscine constante: constant_pool []
indicateur d'accès: access_flags
classe actuelle: this_class
Parent Classe: super_class
Numéro d'interface: interfaces_count
Interface Tableau: les interfaces []
champ Numéro : fields_count
tables de champ: champs []
mode de numéro: methods_count
table de méthodes: les méthodes []
nombre d'attributs: attributes_count
table d'attributs: attributs []

Il appartient aux types de données de base, peut être utilisée pour décrire les numéros principaux, symbole d'index, ou le nombre de valeurs en conformité avec UTF-8 configuration de valeur de chaîne codée, taille utilisée u1, u2, u4, u8 représenter 1 octet, 2 octets, 4 octets et la section 8 octets.
Tableau: nombre non signé est une pluralité de tables ou d'autres éléments de données constituant le type de données complexes, toutes les tables sont utilisées pour « _info » fin. Tableau de données est principalement utilisée pour décrire la relation hiérarchique de la structure composite, telles que les méthodes, les champs.

Chapitre VI, les performances des outils de surveillance
système d'affichage l' utilisation globale des ressources: commande top
paramètres affichés:
PID: un identifiant unique pour l'ID de processus, le processus
utilisateur: le nom d'utilisateur réel du propriétaire du processus
priorité d'ordonnancement du processus: PR. Une valeur de ce champ est « rt ». Cela signifie que ces processus fonctionnent en mode temps réel
NI: belle valeur du processus (priorité). La plus petite valeur signifie une plus grande priorité. Une valeur négative indique une priorité élevée, les valeurs positives indiquent une faible priorité
VIRT: la mémoire virtuelle utilisée par le processus. La quantité totale de mémoire virtuelle utilisée par le procédé, l' unité kb. Le SWAP RES + = VIRT
RES: la taille de la mémoire résidente. Échange taille de la mémoire non-résident de la mémoire physique utilisée par la tâche. Le procédé utilisé, pas troqué la taille de la mémoire physique kB
SHR: SHR est le processus d'utilisation de la mémoire partagée. taille de la mémoire partagée en Ko
S: Ceci est l'état du processus. Il a les différentes valeurs suivantes: D - état de sommeil sans coupure; R - mode de fonctionnement; S - état de sommeil; T - suivi ou arrêté, Z - état zombie
% CPU: Depuis la dernière mise à jour à la tâche actuelle à l' aide pourcentage de temps CPU
% MEM: le pourcentage de mémoire physique disponible utilisé par le processus
tIME +: après tout le temps CPU pour démarrer la tâche maintenant utilisée au centième près d'une seconde
COMMAND: commande pour exécuter le processus utilisé par

Publié 45 articles originaux · a gagné les éloges 9 · vues 30000 +

Je suppose que tu aimes

Origine blog.csdn.net/zhanglinlove/article/details/89474952
conseillé
Classement