ProgramingTip

Java 메모리에서 모니터링하는 방법은 무엇입니까?

bestdevel 2020. 12. 7. 20:31
반응형

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, 요청 세부 정보 (요청 프로파일 러에서 작업 한 호출 스택 포함) 등을 도입합니다. 오버 헤드가 매우 낮습니다.

선택적으로 멋진 시계열 데이터베이스 보드를 함께 사용하여 멋진 대시 보드를 볼 수있는 긴 포인트 기록을 사용할 수 있습니다.

예 : 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, 절대 startTimememoryUsageBeforememoryUsageAfter.

타이머를 사용하여 해당 속성을 읽으십시오. 새로운 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

반응형