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
- La machine virtuelle alloue un cadre de pile pour chaque méthode qui entre dans la pile
- La machine virtuelle crée une pile pour chaque thread pour stocker les informations de la méthode (variables locales, paramètres réels)
- La pile est privée pour le thread et ne peut pas être partagée entre les threads
- Les caractéristiques de stockage de la pile : "premier entré, premier sorti, dernier entré, premier sorti"
- 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)
- La machine virtuelle n'a qu'un tas, qui est partagé par tous les threads
- La méthode de stockage du tas en mémoire est discontinue, donc l'allocation est flexible et la vitesse est lente
- 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
- La zone de méthode est la spécification de javaJVM, qui peut avoir différentes implémentations
- JDK7 était la "génération permanente"
- 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
- JDK8 est une combinaison "d'espace de métadonnées" et de tas, mais il existe toujours
- JVM n'a qu'une seule zone de méthode, qui est partagée par toutes les piles
- La zone de méthode est en fait un tas, qui ne stocke que les informations relatives aux classes et aux constantes
- Stockez le contenu qui ne change jamais, comme les informations de classe, les variables statiques, les chaînes, les constantes, etc.
- 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 :
- trouvé des objets inutiles
- 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
- algorithme de comptage de référence
- 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
- Les programmeurs n'ont pas la permission d'invoquer le ramasse-miettes
- 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
- 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
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默认方法");
}
}