Ce sera un article plus maléfique. Dans le monde de Java, Memory Overflow n'est qu'un bug que vous pouvez introduire dans ce cas. Vos victimes passeront quelques jours, voire quelques semaines de nuits de sommeil au bureau.
Dans cet article, je présenterai deux types de méthodes de débordement, qui sont plus faciles à comprendre et à reproduire. Et ce sont toutes des études de cas du projet source, mais pour vous faire clairement saisir, je les simplifie.
Mais soyez assuré qu'après avoir rencontré et résolu le bogue débordant, des cas similaires seront plus courants que vous ne l'imaginez.
Entrons d'abord l'état.
Class KeylessEntry {static class Key {Integer id; key id (Integer id) {this.id = id;} @Override public int hashcode () {return id.hashcode (). Args) {map m = new hashmap (); "Numéro:" "" + i);}}Lorsque vous exécutez le code ci-dessus, vous pouvez vous attendre à ce qu'il n'ait jamais de problème à exécuter. Cependant, ce n'est pas le cas. Les éléments augmenteront toujours, car la catégorie clé n'implémente pas une méthode equals () appropriée après HashCode ().
La solution est simple, tant que vous ajoutez une méthode égale comme l'exemple suivant. Mais avant de trouver le problème, vous devez avoir dépensé beaucoup de cellules cérébrales précieuses.
@OverRidePublic Boolean Equals (objet O) {Boolean Response = FALSE; Le prochain, vous devez rappeler à vos amis, c'est de gérer la chaîne. Ses performances seront bizarres, surtout lorsque la différence de version JVM sera combinée. Le mécanisme de travail interne de String a été modifié dans JDK 7U6, donc si vous constatez que l'environnement du produit n'est que la différence entre un petit numéro de version, vous êtes prêt pour les conditions. Tarze le code similaire au code suivant, puis lui demander pourquoi ce bogue n'apparaît que dans le produit.
Classe Stringer {statique final mb = 1024 * 512; NanoTime ()); return sb.toString ();} public static void main (String [] args) {list substrings = new ArrayList (); = CreateLongString (MB); String substr = longstr.Substring (1,10);Quel est le problème avec le code ci-dessus? Lorsqu'il s'exécute avant la version du JDK 7U6, la chaîne retournée enregistre une référence à la chaîne d'environ 1 m. Combinés aux différences entre les plateformes et les versions dans votre environnement expérimental, des choses qui nuisent aux Écritures cérébrales se produisent.
Maintenant, si vous souhaitez couvrir vos empreintes de pas, nous pouvons introduire des concepts plus avancés. Par exemple
J'espère que nous vous donnerons des matières premières qui y réfléchissent et des matériaux lorsque vous voulez réparer quelqu'un. Cela apportera un débogage sans fin. À moins que votre ami utilise Plumbr pour trouver l'emplacement débordant.