1. Question: Si les objets A et B sont référencés de manière circulaire, peuvent-ils être GC?
Réponse: Oui, les machines virtuelles utilisent aujourd'hui essentiellement des algorithmes d'analyse d'accessibilité pour déterminer si l'objet survit, plutôt que de simplement se référer au comptage de l'objet. L'algorithme d'analyse d'accessibilité utilise une série d'objets "GC Roots" (objets référencés dans la pile de machine virtuelle, objets de référence d'attribut statique) comme point de départ. Les chemins que ces nœuds recherchent vers le bas sont appelés chaînes de référence. Lorsqu'un objet n'a pas de connexion de chaîne de référence aux racines GC, l'objet est prouvé que l'objet n'est pas disponible.
2. Comment le débordement de la mémoire en Java est-il causé?
OutofMemoryError:
(1) Le programme Pergern Space utilise un grand nombre de bocaux ou de classes, ce qui rend la machine virtuelle Java à ne pas charger d'espace de classe insuffisante.
Solution: ajustez les paramètres xx: permsize et xx: maxpermSize, réduisez les packages JAR et réduisez le chargement en double des classes.
(2) Java Heap Space Java Virtual Machine crée trop d'objets.
Solution: Ajustez les paramètres XMS (taille initiale du tas) XMX (taille maximale du tas), vérifiez les boucles mortes ou les objets en double inutiles
(3) Impossible de créer un nouveau thread natif, le JVM occupe trop d'espace mémoire et la création de threads dans le JVM nécessite également la création de threads dans le système d'exploitation.
Solution: redimensionner les threads dans JVM.
3. String s = "123"; Combien d'objets sont générés dans cette déclaration?
S'il n'y a pas de "123" dans le pool de chaînes, un objet est généré et placé dans le pool constant. S'il y a "123", 0 objets sont générés.
Si String s = new String("123") , s'il n'y a pas dans le pool constant, créez-en un dans le pool constant, puis créez un dans la mémoire du tas.
4. Quelle est la différence entre l'erreur, l'exception et RuntimeException?
L'erreur et l'exception sont les deux sous-classes de jetables, et RuntimeException est une sous-classe d'exception.
Une erreur est utilisée pour indiquer qu'une application raisonnable ne devrait pas tenter d'attraper des erreurs.
L'exception souligne les conditions qu'une application raisonnable doit saisir. Il est divisé en exceptions vérifiées et exceptions non contrôlées.
RuntimeException est une exception qui n'est pas vérifiée, ne nécessite pas d'essayer de prendre ou de déclarer sur la méthode. Les sous-classes principales: nullpointer, arithmatic, arrayIndexoutofbounds, classcast.
5. Quelle est la différence entre le lecteur et l'entrée?
Ce sont toutes des classes abstraites, le lecteur est utilisé pour lire des flux de caractères (char ou chaîne) et InputStream est utilisé pour lire les flux d'octets (tableaux d'octets).
6. Quel est le rôle de HashCode?
HashCode est principalement utilisé pour les recherches rapides, comme dans la structure HashMap, qui est utilisée pour localiser l'emplacement des paires de valeurs clés. Si deux objets sont les mêmes, le HashCode doit être le même, tandis que les objets HashCode avec le même HashCode peuvent ne pas être les mêmes, ce qui équivaut à les mettre dans la même boîte.
7. Quelle est la différence entre le hashmap et le hashtable?
Innocuité de thread, clé de valeur nul, efficacité, hashmap (itérateur Fast Faiche Iterator), hashtable (énumérateur itérateur) et la position de l'élément Hashmap changera au fil du temps
8. Un objet dans Hashmap peut-il être utilisé comme clé? Y a-t-il des exigences pour les objets définis par l'utilisateur comme clé?
Oui, mais l'objet clé doit être un objet immuable. Sinon, une fois l'entrée insérée dans la carte, la modification de la valeur de clé entraînera une incompatibilité de la valeur de clé actuelle avec la valeur de hachage, c'est-à-dire qu'elle ne correspond pas à l'indice du tableau et ne sera pas trouvée.
9. Dois-je utiliser run () ou démarrer () pour démarrer un fil?
Comment résoudre le problème de la synchronisation et de la concurrence dans le multithreading? Qu'est-ce qu'un fil de démon? Qu'est-ce qu'un fil de démon? Qu'est-ce qu'une méthode pour implémenter un thread de démon (la signification de Thread.setDeamon ()) Comment arrêter un fil? Expliquez ce qu'est la sécurité des fils? Donnez un exemple de thread insécurisé. Expliquez le rôle des mots clés synchronisés. Lorsqu'un thread entre une méthode synchronisée d'un objet, d'autres threads peuvent-ils entrer dans d'autres méthodes de cet objet?
(1) commencer
(2) Hériter de la classe de threads, implémenter l'interface Runnable et utiliser ExectUORService, Future et Callable pour implémenter le thread qui renvoie la valeur.
(3) Méthode de synchronisation, bloc de code de synchronisation, verrouillage
(4) Les threads Damon fournissent des services pour le fonctionnement d'autres threads, tels que GC et Thread. setDeamon (true).
(5) thread.stop () n'est pas recommandé (les ressources ne seront pas libérées correctement) et les interruptions sont utilisées pour arrêter les threads.
(6) Lorsque plusieurs threads accèdent à un objet, si la planification et l'exécution alternative de ces threads dans l'environnement d'exécution ne sont pas nécessaires, une synchronisation supplémentaire n'est pas requise, ou toutes les autres opérations de coordination sont effectuées sur l'appelant, et le résultat correct peut être obtenu en appelant cet objet, alors l'objet est en file d'attente.
(7) Les billets sont vendus à plusieurs reprises.
(8) Synchroniser les mots clés. Lors de la modification des méthodes statiques, la classe est utilisée comme objet de verrouillage et un seul thread peut accéder à ce type de méthodes statiques de synchronisation; Lors de la modification des méthodes ordinaires, l'objet est utilisé comme objet de verrouillage et un seul thread peut accéder à ce type de méthodes ordinaires de synchronisation; Vous pouvez également personnaliser le bloc de code de synchronisation des objets de verrouillage.
(9) La méthode synchronisée ne peut pas être entrée et non synchronisée peut être entrée.
10. Quelles nouvelles fonctionnalités de JDK8 avez-vous apprises et décrivez les fonctionnalités correspondantes avec des exemples?
(1) Lambda Expression: programmation fonctionnelle, référence de la méthode
(2) Stream API
(3) Méthode d'interface par défaut
(4) Amélioration de l'API de date et d'heure, ajoutant la méthode DateTimeFormatter
11. Quels sont les principes d'optimisation de SQL?
Pour plus de détails, veuillez consulter un blog dans ma classification de la base de données
12. Quelle est la différence entre Serlvet et CGI dans le cycle de vie du servlet?
Cycle de vie: chargement de classe, instanciation (construction d'objets), initialisation (init), service (service) et détruire.
CGI: Interface de passerelle commune, interface de passerelle commune, écrite en langue perl, crée un objet CGI pour chaque demande.
Servlet: seule l'instanciation et l'initialisation sont requises une fois et multi-threading.
13. Quels sont les avantages de StringBuffer? Pourquoi jeûne?
Parce que StringBuffer ne nécessite pas la création répétée d'objets String, mais ce n'est pas le cas.
Par exemple, String S = "A" + "B" + "C" Le compilateur d'opération optimisera et deviendra String S = "ABC"
Le compilateur STRING S = S1 + S2 + S3 sera également optimisé et deviendra une opération d'ajout StringBuilder. Cependant, s'il n'est pas épissé en un temps + opération, l'objet String et l'objet StringBuilder seront générés à plusieurs reprises, ce qui sera très faible.
14. Comprenez-vous l'algorithme de chiffrement et de décryptage?
Algorithmes abstraits: MD5 (128 bits), SHA1 (160 bits), est un processus irréversible. Peu importe la taille des données, les données de la même longueur seront générées après l'algorithme de digest. Il ne peut être craqué que par des dictionnaires.
Algorithmes de chiffrement symétriques: DES, AES, la même clé secrète est utilisée lors du chiffrement et du décryport.
Algorithme de chiffrement asymétrique: RSA, utilisez différentes clés secrètes lors du chiffrement et du décryport et utilisez RSA2 lors de la connexion à Alipay.
15. Résoudre une concurrence élevée et une charge élevée?
(1) La consommation de page statique est minimale, le HTML est autant que possible et le système de publication d'informations CMS est utilisé pour générer automatiquement des pages statiques dans les données dynamiques de l'entrée d'informations et du cache qui ne sont pas souvent modifiées à l'avant.
(2) CDN, distribuer des ressources telles que CSS / JS sur différents serveurs.
(3) Équilibrage de la charge (Nginx).
(4) Données de cache qui ne sont pas souvent modifiées (redis, memcache).
(5) Le serveur d'images est séparé du serveur d'applications.
(6) Cluster.
16. Cache interne entier?
Il y a un réseau entier statique à l'intérieur de la classe entière, qui stocke certains objets entiers qui ont été initialisés. La valeur générale est (-128 ~ 127). Si vous utilisez == Comparaison, parfois FALSE sera retourné car la valeur n'est pas dans le cache, vous devez donc utiliser égaux pour comparer.
17. Quel est le principe de l'arraylist?
(1) ArrayList est insensible à thread. Si vous voulez une filetage, utilisez CopyOnWriteList.
(2) La couche inférieure est le tableau d'objet [], et il y a une référence ElementData pointant vers le tableau à l'intérieur. Au début, il pointe vers un tableau vide en cache (transitoire) par défaut. Lorsque vous souhaitez vous développer, un nouveau tableau avec une taille de 1,5 fois (x + (x >> 1)) sera re-neuf, puis l'ancien élément sera copié sur le nouveau tableau via la méthode Native.
(3) La complexité de l'algorithme de la méthode de lecture et d'écriture aléatoire (get, set) est O (1).
(4) Il existe deux types d'opérations d'addition. La complexité de l'algorithme de ADD (index, valeur) est O (n), car elle doit être déplacée par la copie des éléments; tandis que la complexité de l'algorithme du fonctionnement ADD (valeur) est O (1) (si l'expansion ne se produit pas).
(5) La complexité temporelle de l'opération de suppression est O (n), car qu'elle soit supprimée en fonction de l'index ou de l'objet, il est nécessaire de mettre en œuvre l'opération de mouvement par copie. Après la suppression, la taille du tableau ne changera pas et la longueur est maintenue par l'attribut de taille. Lors de la suppression des objets par objet, vous ne pouvez pas utiliser de nouveaux objets. Vous devez les supprimer via des références aux objets dans ArrayList.
18. Quel est le principe de Linkedlist?
(1) La couche sous-jacente est une liste liée bidirectionnelle, en maintenant un premier pointeur et un dernier pointeur.
(2) La complexité temporelle de la lecture et de l'écriture aléatoires (get, set) est o (n).
(3) La complexité temporelle de l'opération d'insertion Add (objet) est O (1); La complexité temporelle de ADD (index, objet) est O (n).
(4) La complexité temporelle de l'opération de suppression Supprimer (objet) est O (1); La complexité temporelle de la suppression (index) est O (n).
19. Des choses à noter lors de l'utilisation de pools de threads?
(1) Empêcher les blocages. Tous les threads du pool de threads attendent que l'événement A se produise, et aucun threads gratuit à exécuter A.
(2) Empêcher les ressources système insuffisantes. Pour contrôler le nombre de threads.
(3) Empêcher les erreurs simultanées.
(4) Empêcher les fuites de filetage. Un thread se termine anormalement en raison de RuntimeException ou d'une erreur qui n'est pas capturé normalement, et le pool de threads perd un fil.
(5) Évitez la surcharge de la tâche.
20. Quelle est la différence entre @Autowire et @Resource au printemps?
@Autowire est assemblé par type par défaut. Par défaut, il nécessite que l'objet de dépendance doit exister. Si Null est autorisé, il peut être défini sur FALSE. Si nous voulons utiliser assemblé par nom, nous pouvons l'utiliser en conjonction avec l'annotation @qualifier;
@Resource est assemblé par nom par défaut. Lorsqu'un haricot correspondant au nom ne peut être trouvé, il sera assemblé en fonction du type. Il peut être spécifié via l'attribut de nom. Si l'attribut de nom n'est pas spécifié, lorsque l'annotation est annotée sur le champ, le nom du champ est pris par défaut sous le nom de Nom Bean pour trouver l'objet de dépendance. Lorsque l'annotation est marquée sur la méthode du secteur de l'attribut, le nom d'attribut est pris par défaut comme nom de bean pour trouver l'objet de dépendance.
21. Diagramme de transfert d'état de thread.
22. Méthodes de classe d'objets?
(1) Égalise: Déterminez s'il est égal.
(2) HashCode: Trouvez la valeur de hachage. Si les valeurs de hachage des deux objets sont égales, ce n'est peut-être pas égal; Si égal, les valeurs de hachage des deux objets doivent être égales.
(3) TOSTRING: Obtenez la forme d'expression de chaîne de l'objet, qui est généralement réécrit.
(4) GetClass: méthode de réflexion pour obtenir la classe à laquelle appartient l'objet.
(5) Attendez: il ne peut être utilisé que dans les segments de code synchronisés. Si le paramètre d'heure n'est pas inclus, le fil d'exécution entraînera l'abandon de l'abandon de la serrure et entrera dans l'état d'attente (Pool d'attente).
(6) Afficher: il ne peut être utilisé que dans les segments de code synchronisés, éliminer un fil de la piscine en attente et le mettre dans la piscine de drapeau de verrouillage.
(7) Notifyall: ne peut être utilisé que dans les segments de code synchronisés, et tous les threads sont sortis de la piscine d'attente et placés dans le pool de drapeau de verrouillage.
23. Le principe sous-jacent de la sérialisation Java?
Convertir les informations de l'objet en informations bytecode.
(1) Stockez la description de la sérialisation. (2) Informations de description de la classe actuelle. (3) Description des attributs de classe actuels. (4) Description de la superclasse (5) Attribut de superclasse Description (6) Valeur d'attribut de superclasse Description (7) Valeur d'attribut de sous-classe Description