문제

최근 JVM에는 가비지 수집을 위한 많은 XX 매개변수가 있습니다(참조: 여기 예를 들어) 클라이언트 측 Swing 애플리케이션의 성능을 실제로 더 좋게 만들 수 있는 옵션은 무엇입니까?

클라이언트 측 Java 애플리케이션에서 나를 정말로 짜증나게 하는 것 중 하나는 세계 중지 가비지 수집의 큰 지연입니다.Intelli-J IDEA에서는 3분 이상 진행되는 것을 보았습니다.

편집하다:모든 응답에 감사드립니다.다시 보고하기 위해 다음에서 제안한 설정을 사용하여 IDEA용 CMS 가비지 수집기를 설치했습니다(이 질문을 읽는 대부분의 모든 사람에게 친숙한 응용 프로그램 유형에 대한 좋은 공통 참조임). 여기.또한 -XX:+StringCache를 설정하여 메모리 요구 사항이 줄어드는지 확인했습니다.

일반적으로 관찰해보면, 정기적인 달리기 성능은 눈으로 확인할 수 있을 정도로 저하되지 않습니다.메모리 감소는 거대한 문자열 캐시 옵션을 사용하지만 CMS 방법은 철저하지 않으며 결국 메모리(한 번 실행에 400MB)를 지우기 위해 세계 가비지 수집 주기(3분 대기로 돌아가기)를 중지해야 합니다.

그러나 메모리 공간이 줄어들면 최대 메모리 양을 더 작게 설정하여 세계 컬렉션의 크기를 더 작게 유지할 수도 있습니다.

IDEA 8.1.4는 JDK 1.6.0_12와 함께 제공되므로 아직 G1을 테스트하지 않았습니다.또한 내 컴퓨터에는 코어가 2개만 있으므로 G1 접근 방식은 실제로 최대화되지 않습니다.더 나은 기계를 위해 보스를 공격할 시간입니다;).

도움이 되었습니까?

해결책

이 질문에 대한 단일 답변은 없습니다. 이는 애플리케이션이 수행하는 작업과 해당 개체를 관리하는 방법에 따라 크게 달라집니다.아마도 한번 살펴보세요 가비지 수집은 어떻게 작동하나요? 그리고 병렬 및 동시 가비지 수집기 다양한 옵션을 이해합니다.

그런 다음 Java SE 6 HotSpot[tm] 가상 머신 가비지 수집 튜닝 에 소개된 Java SE 6에 대한 GC 튜닝 개념 및 기술을 확장하는 문서입니다. 5.0 Java Virtual Machine을 사용하여 가비지 수집 조정 문서.

가비지 수집 일시 중지를 짧게 유지하려는 경우 동시 수집기는 대부분의 작업을 동시에(즉, 애플리케이션이 계속 실행되는 동안) 수행하므로 올바른 방향일 가능성이 높습니다.그러나 최상의 설정을 찾으려면 프로파일링이 필요합니다(GC 처리량, 최대 및 평균 일시 중지 시간, 전체 GC 빈도 및 지속 시간 측정도 고려).

(편집하다:OP의 댓글을 읽은 후 다음과 같이 생각합니다. JVM 힙 튜닝에 대한 조언은 손을 떼지 마세요! 성능 전문가인 Kirk Pepperdine의 의견을 듣는 것이 좋습니다.)

다른 팁

쓰레기 수집 튜닝은 과학보다 예술 이상의 것이며 실제로 응용 프로그램과 사용에 달려 있습니다. 표준 중지 전략이 당신을 괴롭히면 CMS (동시 마크 및 스윕) 또는 새로운 G1 수집가로 변환하지 않겠습니까?

가장 좋은 방법은 매개 변수를 변경하고 프로파일 러를 첨부하여 응용 프로그램 동작을 검사하는 것입니다.

이것은 매우 자동이며 우리에게 효과적입니다.

-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log

"최상의"옵션은 없지만 (누군가가 있으면 누구나 사용할 것입니까?) 아마도 귀하의 경우에 도움이되는 옵션 일 수도 있습니다. 그러나 다음은 몇 가지 팁입니다.

  • 최신 VM을 사용하십시오. GC 코드는 모든 릴리스마다 더 나아졌습니다.
  • 클라이언트 JVM.DLL 사용 (사용 가능한 sinve java 1.5 in jre/bin/client/). 이것은 기본값이어야합니다.
  • 자바에서 물체를 할당하고 자유롭게하는 것은 저렴합니다. 그들을 지키는 것은 비싸다.

더 나은 성능을 원한다면 쓰레기 수집가에게 덜 작업하십시오. 객체 풀을 지속적으로 만들고 버리지 않고 객체 풀을 사용하는 것을 고려하고 생성하는 모든 객체가 필요한지 확인하십시오.

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