Optimisation de l'utilisation de la mémoire dans les applications Java
Jul 28, 2025 am 02:40 AMUtilisez des structures de données efficaces comme ArrayList sur LinkedList et des collections primitives pour réduire les frais généraux; 2. Minimiser la création d'objets en réutilisant des objets, en utilisant StringBuilder pour la concaténation et en mettant en cache des objets co?teux; 3. Empêcher les fuites de mémoire en annulant les références, en utilisant des classes intérieures statiques, en désinscrivant les auditeurs et en utilisant des références faibles / douces dans les caches; 4. Assurez le JVM avec une taille de tas appropriée, sélectionnez des collectionneurs de déchets appropriés (par exemple, G1GC, ZGC), activez la journalisation GC et utilisez des outils de surveillance comme VisualVM ou Prométhée avec micromètre; 5. Optimiser l'utilisation des cordes et des tableaux en évitant les internes inutiles, en étant prudent avec la sous-cha?ne () et la taille des baies de coupe - la gestion efficace de la mémoire en Java nécessite un codage intelligent, des outils appropriés et une conscience JVM pour réduire le désabonnement des objets et améliorer les performances.
Les applications Java peuvent consommer plus de mémoire que nécessaire si elles ne sont pas soigneusement con?ues, conduisant à des problèmes de performances, à des pauses de collecte de déchets plus longues et même à des exceptions OutOfMemoryError
. L'optimisation de l'utilisation de la mémoire ne consiste pas seulement à augmenter la taille du tas - il s'agit d'écrire du code efficace et de comprendre comment le JVM gère la mémoire. Voici des stratégies clés pour réduire l'empreinte de la mémoire et améliorer l'efficacité.

1. Utilisez des structures de données appropriées
Le choix de la bonne structure de données peut avoir un impact significatif sur l'utilisation de la mémoire.
- Préférez
ArrayList
àLinkedList
pour la plupart des cas d'utilisation -LinkedList
stocke chaque élément dans un n?ud avec des références aux n?uds suivants et précédents, consommant plus de mémoire. - Utilisez des collections primitives lorsque cela est possible. Les collections Java standard (
List<integer></integer>
,Map<string double></string>
) Stocker des objets, qui incluent les frais généraux. Des bibliothèques comme Trove , FastUtil ou Eclipse Collections offrent des collections économes en mémoire pour les primitives (par exemple,TIntArrayList
au lieu deArrayList<integer></integer>
). - évitez de stocker des données inutiles. Par exemple, utilisez
Set
au lieu deList
si vous n'avez besoin que de l'unicité et que vous ne vous souciez pas de l'ordre.
// moins efficace List <Integer> list = new ArrayList <> (); list.add (42); // Autoboxing: crée un objet entier // plus efficace (avec Trove) TintArrayList list = new TintArrayList (); list.add (42); // Stores Int directement
2. Minimiser la création et réutiliser des objets dans la mesure du possible
Chaque objet créé ajoute de la pression au tas et au collecteur des ordures.

- Réutilisez les objets utilisant des pools d'objets pour des instances co?teuses ou fréquemment créées (par exemple, les connexions de base de données, les threads - bien que les exécuteurs intégrés préfèrent).
- Utilisez des constructeurs ou des modèles de poids mouche lorsque vous traitez des configurations d'objets similaires.
- évitez la concaténation de cha?ne inutile dans les boucles - utilisez à la place
StringBuilder
.
// mauvais: crée plusieurs cha?nes intermédiaires Résultat de cha?ne = ""; pour (String S: cha?nes) { résultat = s; } // bon: Single StringBuilder StringBuilder sb = new StringBuilder (); pour (String S: cha?nes) { SB.APPEND (S); } Résultat de la cha?ne = sb.toString ();
- Caches d'objets co?teux comme
DateFormat
,Pattern
ou Données de configuration au lieu de les recréer.
3. Contr?ler les durées de vie des objets et éviter les fuites de mémoire
Même les objets inutilisés peuvent s'attarder en mémoire si les références sont involontairement détenues.
- Annuler les références dans les objets à longue durée de vie lorsqu'il n'est plus nécessaire (rarement nécessaire dans le Java moderne mais pertinent dans les caches ou les auditeurs).
- Surveillez les fuites de classe intérieure : les classes intérieures non statiques maintiennent une référence implicite à la classe extérieure. Utilisez des classes intérieures
static
lorsque cela est possible. - Les auditeurs non enregistrés (par exemple, événement, modèles d'observateurs) pour éviter l'accumulation.
- Soyez prudent avec les caches - utilisez des références faibles / douces ou des caches bordées (par exemple,
Caffeine
,Guava Cache
) au lieu deHashMap
ordinaire.
// préfère les références faibles pour les caches Map <key, faible référence <value>> cache = new hashmap <> ();
- Sources de fuite courantes:
- Les collections statiques qui poussent indéfiniment
- Streams ou ressources non clos (utilisez des ressources essai
- Variables threadlocal dans les serveurs d'application (en particulier avec la mise en commun de threads)
4. Associer la JVM et le surveillant l'utilisation de la mémoire
Même le code bien écrit bénéficie d'une configuration et d'une surveillance JVM appropriées.

Définissez la taille appropriée du tas :
-XMS512M -XMX2G
évitez de régler
-Xmx
trop élevé - les tas de grandes tas peuvent entra?ner de longues pauses GC.Choisissez le bon collecteur de ordures :
- G1GC (par défaut dans Java 9): bon pour les tas moyens à grands avec des objectifs de temps en pause faible.
- ZGC ou Shenandoah (Java 11 et 12 respectivement): pour de très gros tas avec des temps de pause ultra-bas (<10 ms).
Permettre à la journalisation GC d'analyser le comportement:
-Xlog: GC *, GC Heap = Debug, GC Stats -xlog: GC: /var/log/gc.log
-
Utiliser des outils de surveillance:
- VisualVM , JConsole ou JMC (Contr?le de mission Java) pour une analyse en temps réel.
- Micromètre Prometheus pour la surveillance de la production.
- Tas vidanges (
jmap -dump
) analysé avec le tapis Eclipse pour trouver des porcs de mémoire.
- évitez les string interminants sauf si nécessaire
String.intern()
stocke les cha?nes dans le permgen / métaspace et peut entra?ner des problèmes de mémoire. - Utilisez
String.substring()
soigneusement dans les versions Java plus anciennes (pré-java 7u6): il a partagé le tableau de char sous-jacent. Les versions modernes copient les données. - Tailles de baies de coupe - ne pré-allosez pas les grandes tableaux à moins que cela ne soit nécessaire. Envisagez d'utiliser
ArrayList
avec une croissance contr?lée.
5. Optimiser l'utilisation de la cha?ne et du tableau
Les cha?nes et les tableaux sont des consommateurs de mémoire communs.
L'optimisation de la mémoire en Java est un mélange de pratiques de codage intelligentes, d'outillage approprié et de compréhension du comportement JVM. Concentrez-vous sur la réduction du désabonnement des objets, le choix des structures de données efficaces, l'élimination des fuites et la surveillance avec des données réelles. De petits changements peuvent entra?ner de grandes améliorations de l'évolutivité et de la réactivité.
Fondamentalement, il ne s'agit pas d'écrire moins de code - il s'agit de faire compter chaque octet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Maven est un outil standard pour la gestion et la construction de projet Java. La réponse réside dans le fait qu'il utilise pom.xml pour normaliser la structure du projet, la gestion des dépendances, l'automatisation du cycle de vie de la construction et les extensions de plug-in; 1. Utilisez pom.xml pour définir GroupID, Arfactive, version et dépendances; 2. Commandes Master Core telles que MvnClean, compiler, tester, package, installer et déploier; 3. Utiliser la fonction de dépendance et les exclusions pour gérer les versions et les conflits de dépendance; 4. Organisez de grandes applications via la structure du projet multi-modules et sont gérées uniformément par le POM parent; 5

Setupamaven / gradleprojectwithjax-rsDependces likejersey; 2.CreateArestResourceUsingannotationsSuchas @ pathand @ get; 3.ConfigureTheApplicationViaApplicationsUbclassorweb.xml; 4.AddjacksonforjsonBindingByCludingJersey-Media-Json-Jackson; 5.DeploEp

@Property Decorator est utilisé pour convertir les méthodes en propriétés pour implémenter le contr?le de lecture, de réglage et de suppression des propriétés. 1. Utilisation de base: définissez des attributs en lecture seule via @Property, tels que la zone calculée en fonction du rayon et accédé directement; 2. Utilisation avancée: utilisez @ name.setter et @ name.deleter pour implémenter les opérations de vérification et de suppression de l'attribut d'attribut; 3. Application pratique: effectuer la vérification des données dans les setters, tels que BankAccount pour s'assurer que le solde n'est pas négatif; 4. Spécification de dénomination: les variables internes sont préfixées, les noms de méthode de propriété sont cohérents avec les attributs et le contr?le d'accès unifié est utilisé pour améliorer la sécurité et la maintenabilité du code.

Tout d'abord, utilisez JavaScript pour obtenir les préférences du système utilisateur et les paramètres de thème stockés localement et initialiser le thème de la page; 1. La structure HTML contient un bouton pour déclencher la commutation du sujet; 2. CSS utilise: Root pour définir des variables de thème brillantes, la classe de mode. Dark définit les variables de thème sombres et applique ces variables via var (); 3. JavaScript détecte préfère-Color-Scheme et lit LocalStorage pour déterminer le thème initial; 4. Communiquez la classe en mode noir sur l'élément HTML lorsque vous cliquez sur le bouton et enregistre l'état actuel vers LocalStorage; 5. Tous les changements de couleur sont accompagnés d'une animation de transition de 0,3 seconde pour améliorer l'utilisateur

Oui, un menu déroulant CSS commun peut être implémenté via Pure HTML et CSS sans JavaScript. 1. Utilisez des ul imbriqués et Li pour construire une structure de menu; 2. Utilisez le: Hover Pseudo-Class pour contr?ler l'affichage et la cachette du contenu déroulant; 3. Position définie: relative pour le parent li, et le sous-menu est positionné en utilisant la position: absolue; 4. Le sous-menu défaut par défaut: Aucun, qui devient affichage: Block lorsqu'il a survolé; 5. Le tir-down à plusieurs niveaux peut être réalisé grace à la nidification, combinée à la transition, et à l'ajout d'animations fondues, et adaptées aux terminaux mobiles avec des requêtes multimédias. La solution entière est simple et ne nécessite pas de prise en charge JavaScript, qui convient au grand

Comprendre les composants centraux de la blockchain, y compris les blocs, les hachages, les structures de cha?ne, les mécanismes de consensus et l'immuabilité; 2. Créez une classe de bloc qui contient des données, des horodatages, un hachage et nonce précédent, et implémentez le calcul du hachage SHA-256 et la preuve de l'exploitation de travail; 3. Construisez une classe de blockchain pour gérer les listes de blocs, initialiser le bloc Genesis, ajouter de nouveaux blocs et vérifier l'intégrité de la cha?ne; 4. écrivez la blockchain de test principal, ajoutez des blocs de données de transaction à son tour et à l'état de la cha?ne de sortie; 5. Les fonctions d'amélioration facultatives incluent la prise en charge des transactions, le réseau P2P, la signature numérique, la restapi et la persistance des données; 6. Vous pouvez utiliser des bibliothèques Java Blockchain telles que Hyperledgerfabric, Web3J ou Corda pour l'ouverture au niveau de la production

Pour générer des valeurs de hachage à l'aide de Java, il peut être implémenté via la classe MessagediGest. 1. Obtenez une instance de l'algorithme spécifié, tel que MD5 ou SHA-256; 2. Appelez la méthode .update () à transmettre les données à chiffrer; 3. Appelez la méthode .digest () pour obtenir un tableau d'octets de hachat; 4. Convertir le tableau d'octets en une cha?ne hexadécimale pour la lecture; Pour les entrées telles que les fichiers gros, lisez dans des morceaux et appelez .Update () plusieurs fois; Il est recommandé d'utiliser SHA-256 au lieu de MD5 ou SHA-1 pour assurer la sécurité.

Utilisez dateTime.Strptime () pour convertir les cha?nes de date en objet DateTime. 1. Utilisation de base: Parse "2023-10-05" comme objet DateTime via "% y-% m-% d"; 2. prend en charge plusieurs formats tels que "% m /% d /% y" pour analyser les dates américaines, "% d /% m /% y" pour analyser les dates britanniques, "% b% d,% y% i:% m% p" pour analyser le temps avec AM / PM; 3. Utilisez dateUtil.parser.parse () pour déduire automatiquement les formats inconnus; 4. Utiliser .d
