이것은 더 사악한 기사가 될 것입니다. 누군가의 인생에서 비극을 만들고 싶을 때 Google에 가서 검색 할 수 있습니다. Java의 세계에서 메모리 오버플로는이 경우 소개 할 수있는 버그 일뿐입니다. 피해자는 사무실에서 며칠 또는 몇 주 동안 잠자는 밤을 보낼 것입니다.
이 기사에서는 이해하고 재현하기 쉬운 두 가지 유형의 오버 플로우 방법을 소개합니다. 그리고 그것들은 소스 프로젝트의 모든 사례 연구이지만, 당신을 명확하게 이해하기 위해 나는 그것들을 단순화합니다.
그러나 우리가 넘쳐나는 버그를 만나고 해결 한 후에도 비슷한 사례가 상상하는 것보다 더 일반적 일 것임을 확신합니다.
먼저 상태를 입력하자.
Class Keylessentry {정적 클래스 키 {Integer ID (Integer ID) {this.id = id;} {return id.hashcode ()} public static void main. args) {map m = new hashmap ()에 대한 (int i = 0; i <10000; i ++) if (! "숫자 :" "" " + i);}}위의 코드를 실행하면 실행해야 할 문제가 없을 것으로 예상됩니다. 그러나 이것은 사실이 아닙니다. 핵심 범주는 hashcode () 다음에 적합한 equals () 메소드를 구현하지 않기 때문에 요소는 항상 커집니다.
다음 예제와 같은 동등한 메소드를 추가하는 한 솔루션은 간단합니다. 그러나 문제를 찾기 전에 많은 귀중한 뇌 세포를 소비했을 것입니다.
@overridepublic boolean equals (object o) {boolean response = if (onstanceof key) {respone = (key) o) .ids (this.id);}}. 다음으로 친구를 상기시켜야하는 것은 문자열을 다루는 것입니다. 특히 JVM 버전 차이가 결합 될 때 성능이 이상합니다. String의 내부 작업 메커니즘은 JDK 7U6에서 변경되었으므로 제품 환경이 작은 버전 숫자의 차이 일 경우 조건에 대비할 수 있습니다. 다음 코드와 유사한 코드를 Tarze 다음이 버그가 제품에만 나타나는지 묻습니다.
Class Stringer {static int mb = 1024*512; nanotime (); return sb.tostring ();} public static void main (string [] argstrings = new arraylist () {String Longstr. = Createlongstring (MB); Longstr.Substring (1,10);위의 코드에 어떤 문제가 있습니까? JDK 7U6 버전 이전에 실행되면 반환 된 문자열은 실행할 때 -xmx100m로 설정된 경우 예상치 못한 OOM 실수를받습니다. 실험 환경에서 플랫폼과 버전의 차이점과 결합하여 뇌 성경을 상하게하는 것들이 발생합니다.
이제 발자국을 덮고 싶다면 더 고급 개념을 소개 할 수 있습니다. 예를 들어
나는 당신이 생각하는 원료와 누군가를 수리하고 싶을 때 몇 가지 자재를 제공하기를 바랍니다. 이것은 끝없는 디버깅을 가져옵니다. 친구가 Plumbr을 사용하여 넘쳐나는 위치를 찾지 않는 한.