2022.1.4Bases de Java : méthode de construction, gestion de la mémoire

surcharge du constructeur

Avec ginseng sans ginseng

public class Point {
    double x,y;

    Point(double _x,double _y){
        x=_x;
        y=_y;
    }

    Point(){

    }
}

Modèle de mémoire de machine virtuelle Java

La mémoire de la machine virtuelle peut être divisée en trois zones : stack stack, heap heap, method area method area

empiler:

La méthode à exécuter ou en cours d'exécution est placée sur la pile

  1.  La machine virtuelle alloue un cadre de pile pour chaque méthode qui entre dans la pile
  2. La machine virtuelle crée une pile pour chaque thread pour stocker les informations de la méthode (variables locales, paramètres réels)
  3. La pile est privée pour le thread et ne peut pas être partagée entre les threads
  4. Les caractéristiques de stockage de la pile : "premier entré, premier sorti, dernier entré, premier sorti"
  5. La pile est automatiquement allouée par le système, et la vitesse est rapide.La pile est un espace mémoire continu

tas:

Les objets et tableaux créés sont placés dans le tas (les tableaux sont aussi des objets)

  1. La machine virtuelle n'a qu'un tas, qui est partagé par tous les threads
  2. La méthode de stockage du tas en mémoire est discontinue, donc l'allocation est flexible et la vitesse est lente
  3. Le tas est partagé par tous les threads et de nombreux objets sont créés. Le ramasse-miettes planifiera davantage le recyclage des objets qui n'ont pas été utilisés depuis longtemps, puis les divisera en jeunes générations et anciennes générations.

Zone méthode :

Le seul code d'entité est placé dans la zone de méthode, c'est-à-dire divers plans (classes), pools constants, classes statiques, méthodes

  1. La zone de méthode est la spécification de javaJVM, qui peut avoir différentes implémentations
    1. JDK7 était la "génération permanente"
    2. JDK7 supprime partiellement la "génération permanente" et déplace les variables statiques et les pools de constantes de chaîne vers la mémoire de tas
    3. JDK8 est une combinaison "d'espace de métadonnées" et de tas, mais il existe toujours
  2. JVM n'a qu'une seule zone de méthode, qui est partagée par toutes les piles
  3. La zone de méthode est en fait un tas, qui ne stocke que les informations relatives aux classes et aux constantes
  4. Stockez le contenu qui ne change jamais, comme les informations de classe, les variables statiques, les chaînes, les constantes, etc.
  5. Le pool de constantes stocke principalement : des chaînes, des valeurs constantes finales

mécanisme de collecte des ordures

Java introduit un mécanisme de récupération de place pour améliorer l'efficacité du développement, et les programmeurs n'ont pas besoin de prêter trop d'attention aux mécanismes de gestion de la mémoire

gestion de la mémoire

Dans une large mesure, la gestion de la mémoire est : la gestion des objets dans le tas, y compris l'allocation et la libération de l'espace objet

Allocation de l'espace objet : utilisez le mot-clé new pour créer des objets

Libération : Attribuez simplement l'objet à null

processus de collecte des ordures

Tout algorithme de récupération de place fait généralement deux choses :

  1. trouvé des objets inutiles
  2. Récupérer l'espace occupé par les objets inutilisés

La découverte est que le ramasse-miettes de Java découvre des objets inutiles grâce à des algorithmes associés et les nettoie.

Algorithmes liés à la récupération de place

  1. algorithme de comptage de référence
  2. Méthode accessible par référence (algorithme de recherche racine): c'est-à-dire, à partir d'un nœud GC ROOT (l' objet qui est vivant au moment actuel ), trouvez le nœud de référence correspondant, puis trouvez le nœud de référence sur le nœud trouvé jusqu'à ce que tous les nœuds soient non référencé, les autres nœuds sont considérés comme des nœuds inutiles.

Parlez brièvement de l'algorithme de comptage de références

Autrement dit, chaque objet créé a un compteur de références. Chaque fois qu'une variable fait référence à l'objet, le compteur de références est augmenté de 1, et s'il est déréférencé (null), le compteur de références est -1.

Cas particulier : ce type de déchets n'est pas reconnu

Les objets AB se réfèrent l'un à l'autre, même si ObjA et B cessent de se référencer à l'extérieur, mais ils se référencent à la place et ne peuvent pas être reconnus

 Mécanisme général des déchets de la bande

 C'est quelque chose dans le tas. Maintenant, la zone Edem stocke des objets, exécute un GC mineur pour nettoyer la jeune génération, puis les objets inutiles dans la zone Edem seront nettoyés, et les objets utiles iront à la prochaine zone de survivant , puis exécutez Mineur dans la 1ère zone GC, nettoyez les objets inutiles et transférez dans le District 2, puis retransférez dans le District 1. Pendant plus de 15 fois consécutives, il sera transféré à l'ancienne génération et nettoyé par le Major GC

Le GC complet nettoie la jeune génération, l'ancienne génération et la génération permanente (qui stockent les informations de classe, les zones statiques, etc.)

fuite de mémoire

Cela signifie que le programme dans la mémoire de tas n'est pas libéré pour une raison quelconque, ce qui entraîne un gaspillage de mémoire, entraînant une vitesse d'exécution plus lente ou même un plantage du système

raison

1. Créez beaucoup d'objets inutiles

 2. L'utilisation de classes de collection statiques

Il s'agit d'un grand nombre de balises statiques, et ces propriétés d'objet ou de méthode ne seront pas publiées avant longtemps

3. Divers objets de connexion (objets de flux IO, objets de connexion de base de données, objets de connexion réseau) ne sont pas fermés

4. Mauvaise utilisation des auditeurs

d'autres points

  1. Les programmeurs n'ont pas la permission d'invoquer le ramasse-miettes
  2. Les programmeurs peuvent appeler System.gc(), qui notifie simplement la JVM et n'exécute pas la période de collecte des ordures (Full GC). Utilisez le moins possible et s'appliquera au GC complet, ce qui est coûteux et affecte les performances du système
  3. La méthode finalize de l'objet Object est une méthode fournie par Java aux programmeurs pour libérer des objets ou des ressources, mais elle doit être utilisée le moins possible.

ce

Il y a un this dans chaque objet, qui stocke l'adresse de son propre objet. Appeler this.property revient à s'appeler lui-même, qui sera utilisé dans la méthode, et les paramètres entrants sont copiés dans this.property

statique

 

Les attributs et méthodes avec des balises statiques appartiennent à des classes, les attributs ne seront pas créés avec la création d'objets, et seront automatiquement créés au début du programme. Les attributs et méthodes statiques seront inclus dans les informations de classe

bloc initial statique

public class TestStatic {
    int id;
    String name;

    static String company = "北京尚学堂";
    static {      
                                          
    //通过static{}来对静态属性初始化赋值

        System.out.println("执行类的初始化工作");
        company="腾讯山西太原分部";
        printCompany();
    }
    public TestStatic(int id,String name){
        this.id=id;
        this.name=name;
    }

    public void login(){
        System.out.println(name);
    }

    public static void  printCompany(){
        //login();
        System.out.println(company);
    }

    public static void main(String[] args) {
        TestStatic u = new TestStatic(101,"张小八");
        TestStatic.printCompany();
        TestStatic.company="北京腾讯分部";
        TestStatic.printCompany();
    }
}

Classification et portée des variables

 

La différence fondamentale entre les variables locales, les variables membres et les variables statiques
taper poste de déclaration subordonné à Cycle de vie (portée)
variable locale à l'intérieur d'une méthode ou d'un bloc d'instructions méthode/bloc l'appel de la méthode se termine

Variables membres

(variable d'instance)

À l'intérieur d'une classe, à l'extérieur d'une méthode objet

L'objet est créé et les variables membres sont créées en conséquence

L'objet disparaît et les variables membres disparaissent avec lui

variable statique  

(variable de classe)

A l'intérieur de la classe, modification statique gentil La classe est chargée et les variables statiques sont valides

mécanisme de paquets

C'est un dossier, qui est utilisé pour gérer les classes et résoudre le problème des noms en double

package point;

 mot-clé final

 Connaître Object.toString(), réécrire

public class TestObject extends Object{
    String name;
    String pwd;

    @Override
    public String toString() {
        return  "name='" + name +", pwd='" + pwd ;
    }

    public static void main(String[] args) {
        TestObject a = new TestObject();
        System.out.println(a);
    }
}

==和Object.equals()

"==" représente si les deux parties sont identiques, s'il s'agit d'un type de base, la valeur est égale, s'il s'agit d'un type référence, l'adresse est égale, cela signifie qu'il s'agit du même objet.

equals() est identique à == par défaut, mais réécrire cette méthode, comme comparer si toutes les propriétés de deux objets sont identiques, signifie que les deux objets sont égaux.

mot-clé super

 .

Appelez d'abord le static() de la sous-classe de la classe parente ;

 modificateur d'accès

 

 

 

interface

Après jdk8, les interfaces autorisent les méthodes par défaut et les méthodes statiques

méthode par défaut

public interface TestDefault {
    void printInfo();

    default void more(){
        System.out.println("more,测试默认方法");
    }
}


class TestDefault1 implements TestDefault{


    @Override
    public void printInfo() {
        System.out.println("通过接口实现的方法");
    }

    @Override
    public void more() {
        System.out.println("我重写了more默认方法");
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_41302243/article/details/122298894
conseillé
Classement