Java 메모리에서 모니터링하는 방법은 무엇입니까?
Jboss에서 실행되는 j2ee 애플리케이션이 있고 메모리를 강화합니다. 현재 우리는 다음 코드를 사용합니다.
System.gc();
Runtime rt = Runtime.getRuntime();
long usedMB = (rt.totalMemory() - rt.freeMemory()) / 1024 / 1024;
logger.information(this, "memory usage" + usedMB);
이 코드는 잘 작동합니다. 그것은 현실에 해당하는 기억 곡선을 의미합니다. DB에서 큰 xml 파일을 만들면 곡선이 올라가고 내려갑니다.
컨설턴트는 gc ()를 명시 적으로 호출하는 것이 잘못 잘못되었습니다. "jvm이 gc를 선택시기를 선택하십시오". 그의 필자의 주장으로 기본적은 ... 여기서 논의 된 것과 동일 합니다 . 그러나 나는 여전히 이해하지 않았다.
- 외과 수술을 시행합니까?
- gc ()에 어떤 문제가 있습니까? 명시적인 gc ()에서 보관 수있는 1-3 %로 추정 할 수있는 작은 성능 문제는 신경 쓰지. 고객 사이트에서 시스템을 분석하는 데 도움이됩니다.
VM 메모리에서 무슨 일이 일어나고 있는지보고보고 VisualVM 과 같은 좋은 도구를 많이 사용합니다 . 이 소프트웨어는 무료이며 진행 상황을 확인하는 좋은 방법입니다.
명시적인 gc () 호출에서 실제로 "모형"것은 없습니다. 그러나 gc ()를 호출 할 때 가비지 수집하는 것을 기억하는 것을 "제안"이라고합니다. 해당 명령을 실행하는 정확한 시간에 실행 보장은 없습니다.
VM의 메모리를 모니터링 할 수있는 도구가 있습니다. VM은 JMX를 사용하여 메모리 통계를 노출 할 수 있습니다 . 또한 GC 통계 를 인쇄 하여 시간 경과에 따른 메모리 성능을 확인할 수 있습니다 .
System.gc ()를 호출하면 객체가 새 세대에서 이전 세대로 조기에 이동하고 약한 참조가 조기에 지워 지워 GC의 성능이 될 수 있습니다. 이로 인해 메모리 효율성이 감소하고 GC 시간이 길어지고 캐시 적중이 감소 할 수 있습니다 (약한 참조를 사용하는 캐시의 경우). 컨설턴트의 의견에 동의합니다. System.gc ()가 잘못되었습니다. 하는만큼 멀리 내가 갈을 구석으로 비활성화 명령 줄 스위치를 사용.
stagemonitor를 살펴볼 수 있습니다 . 오픈 소스 자바 (웹) 애플리케이션 성능 모니터입니다. 응답 시간, JVM, 요청 세부 정보 (요청 프로파일 러에서 작업 한 호출 스택 포함) 등을 도입합니다. 오버 헤드가 매우 낮습니다.
선택적으로 멋진 시계열 데이터베이스 보드를 함께 사용하여 멋진 대시 보드를 볼 수있는 긴 포인트 기록을 사용할 수 있습니다.
예 :
상기 살펴보세요 프로젝트 웹 사이트를 스크린 샷, 기능 설명 및 설명서를 참조하십시오.
참고 : 저는 stagemonitor의 개발자입니다.
나는 컨설턴트가 이론에서 옳고 실제로 당신이 옳다고 말할 것입니다. 현상태대로 속담 :
이론적으로 이론과 실제는 동일합니다. 실제로는
Java 스펙에 따르면 System.gc는 가비지 컬렉션을 호출 제안합니다. 실제로는 사례를 생성하고 Sun JVM에서 즉시 실행됩니다.
이론 상으로는 가비지 컬렉션의 미세 조정 된 JVM 구현을 엉망으로 만들 수 있습니다, JVM에 배포 할 일반 코드 작성하지 않는 걱정하지 않고. 그것이 당신을 위해 작동한다면 그것을하십시오.
JMX를 사용해 보거나?
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html
(출처 : sun.com )
Visual VM을 통해 바람둥이 내부에서 무슨 일이 일어나고 있는지 엿보세요. http://www.skill-guru.com/blog/2010/10/05/increasing-permgen-size-in-your-server/
JVM 인수를 사용합니다. http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp#DebuggingOptions
XX : -PrintGC 가비지 컬렉션에서 메시지를 인쇄합니다. 다루기 쉬운.
-XX : -PrintGCDetails 가비지 콜렉션에서 더 많은 세부 사항을 인쇄합니다. 다루기 쉬운. (1.4.0에 도입 됨)
-XX : -PrintGCTimeStamps 가비지 콜렉션에서 타임 스탬프를 인쇄합니다. 관리 가능 (1.4.0에 도입 됨)
-XX : -PrintTenuringDistribution 사용 연령 정보를 인쇄합니다.
명시적인 호출로 JVM을 화나게 System.gc()
하지는 않지만 예상 한 효과가 없을 수 있습니다. 무엇이든 읽고 Brian Goetz가 쓰는 모든 것을 사용하여 JVM의 메모리에 무슨 일이 일어나고 있는지 정말로 이해하기 위해 .
프로덕션 시스템에서 명시 적으로 System.gc ()를 실행하는 것은 끔찍한 생각입니다. 메모리가 크기에 관계없이 전체 GC가 실행되는 동안 전체 시스템이 정지 될 수 있습니다. 수 기가 바이트 크기의 서버에서는 jvm이 어떻게 구성되어 있는지, 얼마나 많은 헤드 룸이 있는지 등에 따라 매우 쉽게 눈에 띄게 될 수 있습니다. 30 초 이상의 일시 중지를 보았습니다.
또 다른 문제는 명시 적으로 GC를 호출함으로써 JVM이 GC를 실행하는 방식을 실제로 모니터링하지 않고 실제로 변경한다는 것입니다. JVM을 구성한 방법에 따라 적절할 때 가비지 수집을 수행하고 일반적으로 점진적으로 (메모리가 부족할 때 전체 GC를 실행하는 것이 아닙니다). 인쇄 할 내용은 JVM이 자체적으로 수행하는 작업과 같지 않을 것입니다. 한 가지 이유는 메모리를 수동으로 지울 때 자동 / 증분 GC가 더 적을 것입니다.
Nick Holt의 게시물이 지적했듯이 GC 활동을 인쇄하는 옵션은 이미 JVM 플래그로 존재합니다.
무료로 인쇄하고 합리적인 간격으로 사용할 수있는 스레드가있을 수 있습니다. 이것은 실제 메모리 사용량을 보여줍니다.
명령 줄에서이 작업을 수행하는 좋은 방법이 마음에 들면 jstat를 사용하십시오.
http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html
로깅 및 그래프 작성에 매우 유용한 구성 가능한 간격으로 원시 정보를 제공합니다.
Java 1.5를 사용하는 경우 모든 종류의 메모리에 대한 숫자를 제공하는 ManagementFactory.getMemoryMXBean ()을 볼 수 있습니다. 힙 및 비힙, perm-gen.
좋은 예는 http://www.freshblurbs.com/explaining-java-lang-outofmemoryerror-permgen-space 에서 찾을 수 있습니다 .
JMX 제공 GC 실행 내역을 사용하는 경우 동일한 이전 / 이후 번호를 사용할 수 있으며 GC를 강제 할 필요가 없습니다.
이러한 GC 실행 (일반적으로 이전 및 새 세대 용)이 정기적 인 간격이 아니므로 플로팅을 위해 시작 시간도 추출해야합니다 (또는 대부분의 경우 시퀀스 번호에 대해 플로팅합니다.). 플로팅에 충분한 실용적인 목적).
예를 들어 ParNewGC가있는 Oracle HotSpot VM에는라는 JMX MBean java.lang:type=GarbageCollector,name=PS Scavenge
이 있고 LastGCInfo 속성이 있으며 마지막 YG 스 캐빈 저 실행의 CompositeData를 반환합니다. 그것은 함께 기록되고 duration
, 절대 startTime
및 memoryUsageBefore
과 memoryUsageAfter
.
타이머를 사용하여 해당 속성을 읽으십시오. 새로운 startTime이 나타날 때마다 새로운 GC 이벤트를 설명한다는 것을 알고 메모리 정보를 추출하고 다음 업데이트를 위해 계속 폴링합니다. ( AttributeChangeNotification
어떻게 든 사용할 수 있는지 확실하지 않습니다 .)
팁 : 타이머에서 마지막 GC 실행까지의 거리를 측정 할 수 있으며, 이것이 플로팅의 resulution에 너무 긴 경우 조건부로 System.gc ()를 호출 할 수 있습니다. 그러나 OLTP 인스턴스에서는 그렇게하지 않습니다.
제안 된대로 VisualVM을 사용하여 기본보기를 가져옵니다.
Eclipse MAT를 사용하여보다 자세한 메모리 분석을 수행 할 수도 있습니다.
프로그램의 정확성을 위해 의존하지 않는 한 System.gc ()를 수행하는 것은 괜찮습니다.
system.gc의 문제점은 JVM이 이미 메모리 사용량에 따라 가비지 수집기에 시간을 자동으로 할당한다는 것입니다.
그러나 예를 들어있는 모바일 장치와 같이 메모리가 매우 할당 된 조건에서 작업하는 경우 System.gc를 사용하면 가비지 수집에 더 많은 CPU 시간을 수동으로 할당해야합니다 (하지만 말했듯이, 당신은 gc의 성능 문제에 대해 걱정하지 않습니다.)
모범 사례는 아마도 대량의 할당 해제를 수행 할 수있는 경우에만 사용하는 것 입니다 (대형 배열 플러시 등).
Gc를 자유롭게 호출하거나 더 나은 방법으로 귀하의 경우에 차이가 많은지 확인한 다음 결정하십시오.
참고 URL : https://stackoverflow.com/questions/1058991/how-to-monitor-java-memory-usage
'ProgramingTip' 카테고리의 다른 글
정식에서 할당 오류 전에 참조 됨 (0) | 2020.12.07 |
---|---|
"반환"키보드 버튼의 텍스트 변경 (0) | 2020.12.07 |
해당하는 Maven 2 어셈블리 : "시스템"범위의 jar가 포함되지 않음 (0) | 2020.12.07 |
마더 프레임 워크에서 상위 5 개 선택 (0) | 2020.12.07 |
어디까지입니까? (0) | 2020.12.07 |