문제

StringBuilders에서 멋진 SystemOutOfMemory 예외를 얻고 있습니다.RAM이 부족한 것은 아니므로 나는 그것이 기억 단편이라고 생각한다.

~ 200 StringBuiler 객체가 있습니다.이 모든 것은 정기적으로 재사용됩니다 (strbldr.clear ()).이것은 제 시스템이 기억을 꽤 나쁘게 조각화시키는 것처럼 보입니다.어떻게 해결할 수 있습니까?

감사합니다 :)

편집 :

여기에 몇 가지 데이터가 있습니다 :

입력 및 StringBuilder의 최대 녹음 크기 : 4 146 698.

avarage stringbuilders / second :> 120 (가능하면 >> 120)

입력 길이 @ 첫 번째 오류 : 16 972 (문자열)

StringBuilder Length @ 첫 번째 오류 : 16

새로운 StringBuilder가 이루어 졌던 때 @ 첫 번째 오류 : ~ 32500

총 RAM 사용량 @ 첫 번째 오류 637 448K

도움이 되었습니까?

해결책

I 동의하며, 대부분 기억이 부족하지는 않지만 조각화로 이루어지지 않을 것입니다.

조각화와 대형 객체 힙 (LOH)으로 익숙해 져야합니다.

세부 정보를 제공하지 않으므로 매우 넓은 조언 만 제공 할 수 있습니다.

  • 문자열이 얼마나 큰지를 추정하고 새로운 SB 의 용량 매개 변수를 사용합니다.
  • 라운드 (실제로) 일부 숫자를 배수하는 크기 (실제로).이것은 재사용을 촉진합니다.
  • 는 새로운 내용이 오래된 것과 거의 같은 크기가 될 것으로 기대되면 클리어 ()를 사용합니다.

    편집

    입력 및 StringBuilder의 최대 녹음 크기 : 4 146 698.

    • 더 큰 크기로 필요한 중간체가 없는지 확인한 다음
    • sb1 = new StringBuilder(4200000); 와 같은 모든 stringbuilders 생성
    • 는 그들을 재사용하려고하지 마십시오 (너무 많이 / 모두)
    • 너무 오래 주위를 유지하지 마십시오

다른 팁

LIKE LIKE StringBuilder를 재사용해서는 안됩니다. 필요에 따라 새 것을 만듭니다.

Clear에서 StringBuilder를 호출하면 사용 된 모든 메모리를 해제하지 않으면 사용 된 크기 만 0으로만 재설정됩니다.그것은 여전히 큰 버퍼를 가지고 있으며, StringBuilder의 반복적 인 사용은 버퍼가 필요없는 것처럼 커지지 않으며 절대로 줄어들지 않는다는 것을 의미합니다.

또한 재사용을 위해 StringBuilder 객체를 유지하면 가비지 콜렉션을 좌절시키고 차세대 힙으로 이동한다는 것을 의미합니다.그것들은 자주 덜 수집되므로 메모리 단편화에 대한 감각적 인 것이 더 가능성이 높습니다.

내가 끝내는 것은 x64 로 이주하는 것입니다.이것은 내 문제를 해결했습니다.

x86의 전체 메모리 공간을 모두 사용할 수 없을 수도 있습니다.x64로 마이그레이션하면 그 문제를 해결할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top