Je voulais juste dire ceci pour tous ceux qui se demandent pourquoi quelqu'un peut manquer de mémoire : je travaille sur un projet qui manque fréquemment de mémoire et j'ai dû mettre en place une solution pour cela.
le projet est un composant d'une application de médecine légale et d'investigation. après avoir collecté des données sur le terrain (en utilisant une empreinte mémoire très faible, d'ailleurs), les données sont ouvertes dans notre application d'investigation. une des fonctionnalités est d'effectuer une traversée CFG de n'importe quelle image binaire arbitraire qui a été capturée sur le terrain (applications de la mémoire physique). ces traversées peuvent prendre beaucoup de temps, mais produisent des représentations visuelles très utiles du binaire qui a été traversé.
pour accélérer le processus de traversée, nous essayons de garder autant de données que possible en mémoire physique, mais les structures de données grandissent en même temps que le binaire et nous ne pouvons pas tout garder en mémoire (le but est d'utiliser un tas java inférieur à 256m). alors que faire ?
J'ai créé des versions de LinkedLists, Hashtables, etc. sauvegardées sur disque. Ces versions sont des remplacements immédiats de leurs homologues et mettent en œuvre toutes les mêmes interfaces, de sorte qu'elles semblent identiques de l'extérieur.
la différence ? ces structures de remplacement coopèrent les unes avec les autres, en détectant les erreurs de mémoire et en demandant que les éléments les moins récemment utilisés de la collection la moins récemment utilisée soient libérés de la mémoire. libérer l'élément le dépose sur le disque dans un fichier temporaire (dans le répertoire temp fourni par le système) et marque un objet de remplacement comme "paginé" dans la collection appropriée.
il y a des PLIEUX de raisons pour lesquelles vous pouvez manquer de mémoire dans une application java - la Racine de la plupart de ces raisons est l'une ou l'autre ou les deux : 1. L'application fonctionne sur une machine à ressources limitées (ou tente de limiter l'utilisation des ressources en limitant la taille du tas). 2. L'application nécessite simplement de grandes quantités de mémoire (l'édition d'images a été suggérée, mais qu'en est-il de l'audio et de la vidéo ? qu'en est-il des compilateurs comme dans mon cas ? qu'en est-il des collecteurs de données à long terme sans stockage non-volatile ?)
-bit
2 votes
Demander comment gérer l'épuisement de la mémoire n'est pas tout à fait la même chose que demander s'il est possible d'attraper un message d'erreur de type
OutOfMemoryError
. Donc, ce n'est pas tout à fait une copie de Comment gérer OutOfMemoryError en Java ? .