2011-01-17 5 views
3

기본적으로 몇 초 (일반적으로 1 분 미만이지만 일부 데이터는 1 시간까지 저장 됨)에 데이터를 저장하기 위해 새로운 바이트 배열 (1K 미만)을 만듭니다. 디스크 및 데이터가 가비지가됩니다. 대략 초당 400 패킷이 생성됩니다. GC (특히 Java 6)에서 빠르게 생성되고 릴리스 된 메모리 부품에 대해 걱정하지 않는다고 말하는 기사를 읽었습니다. GC가 너무 오래 실행되면 애플리케이션에 문제가 발생할 수 있습니다. 일부 GC 매개 변수 (Bigger XMX 및 ParalelGC)를 설정하면 전체 GC 시간이 줄어들지 만 아직 충분하지 않습니다. 2 아이디어, GC 매개 변수를 집중 시키거나 바이트 배열 메모리 풀 메커니즘을 만들 수 있습니까? 어느 것이 더 낫습니까?Java에서 쓰레기 문제가 너무 많습니다.

+3

가 왜의 -Xmx을 증가 않습니다 도와 드릴까요? 메모리가 실제로 필요하지 않는 한, 일반적으로 * 앱을 느려지 게 만듭니다 (불필요한 쓰레기가 더 많이 남을 수 있고 GC가 더 많이 작동해야하기 때문에). 일반적으로 "충분한"메모리를 제공해야합니다. 아니 더! –

+0

-mx를 증가 시키면 GC 수행 빈도를 줄일 수 있지만 수행 할 때 소요되는 시간을 늘릴 수 있습니다. –

+0

다른 방법으로는 처리량을 다른 스레드로 넘겨서 CPU 대역폭을 더 많이 활용할 수 있습니다 (멀티 코어를 사용한다고 가정). – msandiford

답변

0

GC가 제대로 작동하지 않는 이유에 대한 분석을 제안합니다. jmap을 사용하여 힙을 덤프 한 다음 jhat 또는 Eclipse Memory Analyser을 사용하여 어떤 개체가 그 안에 들어 있는지 확인할 수 있습니다. 더 이상 필요하지 않은 참조를 붙잡고있는 것일 수 있습니다.

GC는 매우 영리하며 자신의 메모리 관리 코드로 outsmart하려고하면 실제로 상황이 악화 될 수 있습니다. 매개 변수 조정을 시도해보십시오. 아마도 새로운 G1 가비지 수집기를 사용해 볼 수도 있습니다.

또한 GC는 수명이 짧고 변경되지 않는 개체를 좋아합니다. 코드를 식별 할 수

4

GC 실행 빈도는 개체 크기에 따라 다르지만 비용 (정리 시간)은 개체 수에 따라 다릅니다. 나는 오래된 공간에서 끝날 때까지 긴 생물 배열이 공간 사이에 복사되고있는 것으로 의심하고 마침내 버렸다. 오래된 세대 청소는 비교적 비쌉니다.

ByteBuffer를 사용하여 데이터를 저장하는 것이 좋습니다. 이것들은 byte []와 비슷하지만 크기가 다양하며 NIO에서 직접 바이트 버퍼를 사용할 수 있다면 약간 더 효율적일 수 있습니다. 버퍼를 미리 할당하면 버퍼를 미리 할당하는 것이 더 효율적일 수 있습니다. (가상 메모리를 낭비 할 수는 있지만)

BTW : 직접 바이트 버퍼는 "C"공간에서 메모리를 사용하므로 힙 공간이 적습니다.

관련 문제