これは、より邪悪な記事になります。 Javaの世界では、メモリオーバーフローは、この場合に紹介する可能性のあるバグです。あなたの犠牲者は、オフィスで数日または数週間の睡眠の夜を過ごすでしょう。
この記事では、2種類のオーバーフローメソッドを紹介します。これは、理解して再現しやすいものです。そして、それらはすべてソースプロジェクトのケーススタディですが、あなたを明確に把握させるために、私はそれらを単純化します。
しかし、私たちが遭遇してあふれるバグに遭遇して解決した後、同様のケースがあなたが想像するよりも一般的になることに安心してください。
最初にHashset/Hashmapを使用する場合、使用される重要な値はequals()/HashCode()メソッドが正しくないため、悪名高いエラーが発生します。
class keylessentry {static class key {integer id(integer id){this.id = id;} args){map m = new hashmap(); for(int i = 0; i <10000; i ++)for "number:" "" + i);}}上記のコードを実行すると、結局は実行するのに問題がないと予想されます。ただし、そうではありません。キーカテゴリは、HashCode()の後に適切なEquals()メソッドを実装しないため、要素は常に成長します。
次の例のように等しい方法を追加する限り、ソリューションは簡単です。しかし、問題を見つける前に、あなたは多くの貴重な脳細胞を費やしたに違いありません。
@OverridePublic Boolean Equals(Object O){boolean Response = false(onstanceof key){((key)o).ids(this.id);} retu rn response;}次のものは、友人に思い出させることです。特にJVMバージョンの違いが組み合わされている場合、そのパフォーマンスは奇妙になります。 Stringの内部作業メカニズムはJDK 7U6で変更されているため、製品環境が小さなバージョン番号の違いにすぎないことがわかった場合、条件の準備ができています。次のコードと同様のコードをターゼしてから、このバグが製品にのみ表示される理由を尋ねます。
Class Stringer {Static String createLOngString(stringbuilder); nanotime()); return sb.toString();} public static void(string [] args = new arrayList(); = CreateLongString(MB);上記のコードの何が問題になっていますか? JDK 7U6のバージョンの前に実行されると、返された文字列は、約1Mサイズの文字列への参照を保存します。実験環境のプラットフォームとバージョンの違いと組み合わせることで、脳の聖書を傷つけるものが発生します。
フットプリントを隠したい場合は、より高度な概念を紹介できます。例えば
誰かを修理したいときに、考えている原材料といくつかの材料を提供していただければ幸いです。これにより、無限のデバッグがもたらされます。友人がPrumbrを使用してあふれる場所を見つけない限り。