Maison > Java > javaDidacticiel > le corps du texte

Comment mesurer et optimiser l'utilisation de la mémoire des fonctions Java ?

王林
Libérer: 2024-04-21 09:51:01
original
647 Les gens l'ont consulté

Mesurer et optimiser l'utilisation de la mémoire des fonctions Java est crucial, et l'utilisation de la mémoire peut être obtenue via JMX. Afin d'optimiser l'utilisation de la mémoire, vous pouvez utiliser des types de référence, éviter les fuites de mémoire et utiliser un mécanisme de pool ; des cas réels montrent que grâce à la technologie d'optimisation, l'utilisation de la mémoire peut être réduite de 150 Mo à 10 Mo, améliorant considérablement les performances des fonctions.

Comment mesurer et optimiser lutilisation de la mémoire des fonctions Java ?

Comment mesurer et optimiser l'utilisation de la mémoire des fonctions Java

L'utilisation de la mémoire est essentielle aux performances des fonctions Java. Une utilisation excessive de la mémoire peut entraîner une dégradation des performances, voire une OutOfMemoryError. Cet article présentera comment mesurer et optimiser l'utilisation de la mémoire des fonctions Java et fournira des exemples pratiques.

Mesurer l'utilisation de la mémoire

Utilisez l'API Java Monitoring and Management (JMX) pour mesurer l'utilisation de la mémoire de votre application. L'extrait de code suivant montre comment obtenir la taille du tas Java à l'aide de JMX :

import java.lang.management.ManagementFactory;

public class MemoryUsageExample {

    public static void main(String[] args) {
        long heapSize = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();
        System.out.println("Used heap memory: " + heapSize + " bytes");
    }
}
Copier après la connexion

Optimiser l'utilisation de la mémoire

1 Utiliser des types de référence

Utiliser des types de référence comme String et ArrayList au lieu de types primitifs comme String et int) peut réduire l’utilisation de la mémoire. Les types de référence utilisent des pools constants, ce qui signifie que plusieurs instances de la même valeur ne sont stockées qu'une seule fois.

// 使用原始类型
int[] numbers = new int[] { 1, 2, 3 };

// 使用引用类型
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
Copier après la connexion

2. Évitez les fuites de mémoire

Une fuite de mémoire se produit lorsqu'un objet n'est plus utilisé mais occupe toujours de la mémoire dans le tas. Cela peut se produire en ne publiant pas les références qui ne sont plus nécessaires ou en utilisant des classes internes provenant de portées externes.

public class MemoryLeakExample {

    public static void main(String[] args) {
        ArrayList<Object> list = new ArrayList<>();

        for (int i = 0; i < 10000; i++) {
            list.add(new Object());
        }

        // 未释放列表中的引用
    }
}
Copier après la connexion

3. Utilisez le mécanisme de pool

En utilisant des pools d'objets pour réutiliser des objets, vous pouvez réduire le nombre d'allocations de mémoire. Ceci est particulièrement utile lors de la création d'un grand nombre d'objets temporaires.

import java.util.concurrent.ConcurrentHashMap;

public class ObjectPoolExample {

    private static ConcurrentHashMap<Class<?>, Object> pool = new ConcurrentHashMap<>();

    public static <T> T get(Class<T> type) {
        return (T) pool.computeIfAbsent(type, t -> new Object());
    }

    public static void release(Object object) {
        pool.remove(object.getClass());
    }
}
Copier après la connexion

Cas pratique

Supposons que nous ayons une fonction qui calcule la moyenne d'un grand ensemble. Voici le code optimisé :

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.LongStream;

public class AverageCalculator {

    public static double calculateAverage(List<Long> numbers) {
        // 使用引用类型并避免内存泄漏
        List<Long> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toList());

        return uniqueNumbers.stream().reduce(0L, Long::sum) / uniqueNumbers.size();
    }

    public static void main(String[] args) {
        List<Long> numbers = LongStream.range(0, 1000000).boxed().toList();
        // 使用 JMX 衡量内存使用
        long before = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();
        double average = calculateAverage(numbers);
        long after = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed();
        // 计算内存消耗
        System.out.println("Memory consumed: " + (after - before) + " bytes");
        System.out.println("Average: " + average);
    }
}
Copier après la connexion

En appliquant ces techniques d'optimisation, nous avons pu réduire l'utilisation mémoire de la fonction de 150 Mo à 10 Mo, améliorant ainsi considérablement ses performances.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!