기본적으로 몇 초 (일반적으로 1 분 미만이지만 일부 데이터는 1 시간까지 저장 됨)에 데이터를 저장하기 위해 새로운 바이트 배열 (1K 미만)을 만듭니다. 디스크 및 데이터가 가비지가됩니다. 대략 초당 400 패킷이 생성됩니다. GC (특히 Java 6)에서 빠르게 생성되고 릴리스 된 메모리 부품에 대해 걱정하지 않는다고 말하는 기사를 읽었습니다. GC가 너무 오래 실행되면 애플리케이션에 문제가 발생할 수 있습니다. 일부 GC 매개 변수 (Bigger XMX 및 ParalelGC)를 설정하면 전체 GC 시간이 줄어들지 만 아직 충분하지 않습니다. 2 아이디어, GC 매개 변수를 집중 시키거나 바이트 배열 메모리 풀 메커니즘을 만들 수 있습니까? 어느 것이 더 낫습니까?Java에서 쓰레기 문제가 너무 많습니다.
3
A
답변
0
GC가 제대로 작동하지 않는 이유에 대한 분석을 제안합니다. jmap
을 사용하여 힙을 덤프 한 다음 jhat
또는 Eclipse Memory Analyser을 사용하여 어떤 개체가 그 안에 들어 있는지 확인할 수 있습니다. 더 이상 필요하지 않은 참조를 붙잡고있는 것일 수 있습니다.
GC는 매우 영리하며 자신의 메모리 관리 코드로 outsmart하려고하면 실제로 상황이 악화 될 수 있습니다. 매개 변수 조정을 시도해보십시오. 아마도 새로운 G1 가비지 수집기를 사용해 볼 수도 있습니다.
또한 GC는 수명이 짧고 변경되지 않는 개체를 좋아합니다. 코드를 식별 할 수
4
GC 실행 빈도는 개체 크기에 따라 다르지만 비용 (정리 시간)은 개체 수에 따라 다릅니다. 나는 오래된 공간에서 끝날 때까지 긴 생물 배열이 공간 사이에 복사되고있는 것으로 의심하고 마침내 버렸다. 오래된 세대 청소는 비교적 비쌉니다.
ByteBuffer를 사용하여 데이터를 저장하는 것이 좋습니다. 이것들은 byte []와 비슷하지만 크기가 다양하며 NIO에서 직접 바이트 버퍼를 사용할 수 있다면 약간 더 효율적일 수 있습니다. 버퍼를 미리 할당하면 버퍼를 미리 할당하는 것이 더 효율적일 수 있습니다. (가상 메모리를 낭비 할 수는 있지만)
BTW : 직접 바이트 버퍼는 "C"공간에서 메모리를 사용하므로 힙 공간이 적습니다.
0
- 사용 프로파일 러는
- 가있는 WeakReferences으로 시도 니펫을.
- 큰 힙을 설정 VM
-Xgc: parallel
- 에 GC의 너 한테 제안하고 MEM에게
- 은 아래에서 가비지 수집을 위해 설정됩니다.
공유-XX:+UseISM -XX:+AggressiveHeap
-XX:SurvivorRatio 8
관련 문제
- 1. 스레드가 너무 많습니다. 예외
- 2. IE에서 setTimeout이 너무 많습니다.
- 3. 데이터베이스 업데이트가 너무 많습니다.
- 4. MongoDB - node.js가 너무 많습니다.
- 5. 동적 어셈블리가 너무 많습니다.
- 6. 리디렉션이 너무 많습니다.
- 7. futex() 호출이 너무 많습니다.
- 8. PHP 쿠키가 너무 많습니다.
- 9. 연결이 너무 많습니다.
- 10. 룩업 테이블이 너무 많습니다.
- 11. PHP 메모리가 너무 많습니다
- 12. JavaCC : 경고가 너무 많습니다.
- 13. AS3 : 쓰레기 수거량이 너무 큽니까?
- 14. 간접 지정 계층이 너무 많습니다. 너무 많습니까?
- 15. 메서드 호출에 인수가 너무 많습니다.
- 16. ASP.NET의 로컬 변수가 너무 많습니다.
- 17. 함수에 대한 인자가 너무 많습니다.
- 18. 양식의 입력 필드가 너무 많습니다.
- 19. '열려있는 파일이 너무 많습니다.'오류
- 20. com.android.ddmlib.SyncException : 열려있는 파일이 너무 많습니다.
- 21. Android - MediaPlayer의 인스턴스가 너무 많습니다.
- 22. dispatchDraw가 너무 많습니다. 이유가 무엇입니까?
- 23. 페이지 새로 고침이 너무 많습니다.
- 24. 문자 리터럴에 문자가 너무 많습니다.
- 25. Python 시간대 - pytz.common_timezones가 너무 많습니다
- 26. 데이터베이스에있는 테이블/sprocs/함수의 개수가 너무 많습니다.
- 27. jad 파일에 코드 부분이 너무 많습니다.
- 28. 동기화 통신으로 인해 스레드가 너무 많습니다.
- 29. 값 오류 : 포장을 푸는 값이 너무 많습니다.
- 30. JDBCTemplate 및 c3p0을 사용하는 연결이 너무 많습니다.
가 왜의 -Xmx을 증가 않습니다 도와 드릴까요? 메모리가 실제로 필요하지 않는 한, 일반적으로 * 앱을 느려지 게 만듭니다 (불필요한 쓰레기가 더 많이 남을 수 있고 GC가 더 많이 작동해야하기 때문에). 일반적으로 "충분한"메모리를 제공해야합니다. 아니 더! –
-mx를 증가 시키면 GC 수행 빈도를 줄일 수 있지만 수행 할 때 소요되는 시간을 늘릴 수 있습니다. –
다른 방법으로는 처리량을 다른 스레드로 넘겨서 CPU 대역폭을 더 많이 활용할 수 있습니다 (멀티 코어를 사용한다고 가정). – msandiford