Question

Que faites-vous lors du retour de malloc 0 ou une nouvelle throws Exception? Il suffit de mettre un terme ou d'essayer de survivre OOM état / sauvegarde du travail de l'utilisateur?

Était-ce utile?

La solution

Il faut éviter la OOM comme éviter un accident.

Évitez de faire énorme morceau de travail (et allouer énorme morceau de mémoire) à la fois. Conserver les données sur le disque, faites confiance le cache disque du système d'exploitation et utiliser IO mappé en mémoire autant que possible, et ne fonctionne que sur une petite partie des données à la fois. Si de grandes quantités de données doivent être en ligne (servi avec une faible latence), puis les garder dans la mémoire à travers plusieurs machines, comme toutes les grandes entreprises de moteurs de recherche font. Ou acheter un SSD.

Autres conseils

La plupart des gens ont répondu à cette question ont probablement jamais travaillé sur les systèmes embarqués, où malloc retour 0 est une possibilité très réelle. Sur un système je travaille actuellement sur, il y a un total de 4.25K octets de RAM (c'est 4352 octets). J'allouer 64 octets pour la pile, et ont actuellement un tas 1600 octets. Pas plus tard qu'hier je débogage une routine de promenade en tas pour que je puisse suivre l'allocation et de libérer de la mémoire. Le pied de tas utilise une petite (30 octets) tampon alloué statiquement à la sortie d'un port série. Il sera désactivé pour la version.

Comme il est un produit de consommation, il vaut mieux ne pas manquer de mémoire une fois a été libéré le produit. Je suis sûr que ce sera au cours du développement. Dans tous les cas, tout ce que je peux faire est de bip le haut-parleur deux ou trois fois, et forcer un redémarrage.

Pour être assez honnête, dans tous les projets que j'ai fait (garder à l'esprit que je ne travaille pas encore nulle part), je ne l'ai jamais considéré que cela pourrait arriver, et donc je suppose que mes programmes mourraient une mort très rapide .

De plus, la manipulation d'un OOM vous oblige à avoir préalloué les ressources pour afficher le message d'erreur ou d'enregistrer tout ce qui peut être de nature pratique.

Je pense que ces jours-ci, la mémoire coûte moins arachides, ce n'est pas quelque chose qui devrait se produire fréquemment. A l'aube de la mémoire protégée et avant, peut-être était une préoccupation, mais maintenant? Les seules erreurs de OOM que j'ai jamais vu étaient à partir du code buggé.

Vérification des codes de retour malloc est usuall de toute façon inutile.

mémoire overcommit Les systèmes modernes d'exploitation: Ils donnent plus de mémoire que les processus est réellement disponible. La mémoire de votre processus est accordé est virtuel, tous mis en correspondance avec une seule page réduites à zéro.

Il est pas jusqu'à ce que vous écrivez à la mémoire physique, unique page est allouée pour vos processus. Si cette allocation échoue le noyau mettra fin à un processus (peut-être le vôtre!) Pour tenter de trouver de la mémoire. À ce moment-là il n'y a rien que vous pouvez faire plus.

À moins que vous développez pour les systèmes embarqués, les systèmes en temps réel, ou les systèmes qui sont si critiques que les échecs peuvent coûter des vies ou des milliards de dollars ... alors il est probablement pas financièrement la peine à se soucier de conditions de mémoire .

Dans la plupart des cas, il y a peu qui peut être fait lorsque vous êtes hors de la mémoire de toute façon, car il n'y a pas de mémoire pour créer de nouveaux objets ou effectuer des tâches qui peuvent faire quelque chose. Vous devez peser le coût de l'application de manutention OOM par rapport au bénéfice que vous obtenez de le faire.

Je toujours vérifier l'erreur. Si quelque chose retourne une condition d'erreur, alors il doit être manipulé par votre programme. Même si elle est un message qui dit « Mémoire insuffisante, faut y aller! », Il vaut mieux que « violation d'accès », « core dumped », ou autre. L'une est une condition d'erreur que vous gérez, l'autre est un bug. Et l'utilisateur percevra comme tel aussi bien.

Pour votre cas spécifique, vous pouvez essayer de faire reculer l'opération, ce qui libère des ressources que vous avez alloué jusqu'à atteindre le point de défaillance, signalant l'erreur et l'exécution continue (peut-être quand vous essayez de quitter l'application, vous peut donner la possibilité de quitter immédiatement). De cette façon, l'utilisateur peut décider ce qu'il faut faire ou essayer de libérer de la mémoire en bidouiller, la fermeture des dossiers, etc. Bien sûr, comment vous pouvez gérer la situation dépend fortement de votre programme - un programme qui est censé ne pas BUM probablement juste besoin de connecter l'erreur et soit arrêter de fumer, ou continuer.

Licencié sous: CC-BY-SA avec attribution
scroll top