반응형

 

1. goaccess 라는 녀석을 설치한다.

#> yum install goaccess

 

관련 URL : https://goaccess.io/

 

GoAccess - Visual Web Log Analyzer

Why GoAccess? GoAccess was designed to be a fast, terminal-based log analyzer. Its core idea is to quickly analyze and view web server statistics in real time without needing to use your browser (great if you want to do a quick analysis of your access log

goaccess.io

 

2. 다음 명령을 통해 html 로 출력한다. (실시간)

goaccess -f [log파일] -o [출력html파일명] --log-format=COMMON --real-time-html

 

참고 : https://ma.ttias.be/analysing-webservers-logs-locally-with-goaccess/

 

Analysing webservers logs locally with goaccess

I want to show you how I use a tool called goaccess to do some quick analysis of access logs on webservers.

ma.ttias.be

 

 

반응형
반응형

 

설치 : http://naver.github.io/pinpoint/1.8.4/main.html

 

Pinpoint 1.8.4 | Leading Open-Source APM

What’s New in 1.8.4 If you want to communicate data between Span and Stat over TCP , we highly suggest upgrading your agent to 1.8.4 as it includes a bug fix for it. Enhancements Allow collector to log received span/stat packet count Avoid storing excessiv

naver.github.io

 

http://naver.github.io/pinpoint/1.8.4/installation.html

 

Installation | Leading Open-Source APM

To set up your very own Pinpoint instance you can either download the build results from our latest release, or manually build from your Git clone. In order to run your own Pinpoint instance, you will need to run below components: HBase (for storage) Pinpo

naver.github.io

1. 자바 6 ~ 9 까지 설치 후 JAVA_X_HOME 설정

2. mvnw 명령어를 사용하여 빌드

3. 설치 폴더/quickstart/bin 아래

   - ./start-hbase.sh (DB 시작)

   - ./init-hbase.sh (Table 생성 작업으로 최초 한번)

   - ./start-collector.sh (콜렉터 시작)

   - ./start-web.sh

===== TEST App 수행 ====

   - ./start-testapp.sh

 

4. 접근 UI

    WEB UI : http://localhost:28080

    TEST UI : http://localhost:28081

 

5. Stop (START 반대)

  설치 폴더/quickstart/bin 아래

   ./stop-testapp.sh

   ./stop-web.sh

   ./stop-collector.sh

   ./stop-hbase.sh

 

 

반응형
반응형

- 시큐어 코딩 점검 툴


시큐어 코딩 점검 툴을 검색하던중


yasca 로 꽤 괜찮은 (아마도 사용자가 임의 패턴 추가 기능이 있으며, c,java,c++등 다양한 언어지원되는점) 툴이 있음을 발견 하였다.

(오픈 소스 무료임...)


품질 검증 분야 무료 툴 소개 : http://www.oss.kr/oss_intro13


소스 코드 보안 툴 : http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html


yasca 메인 페이지 : http://www.scovetta.com/yasca.html



- 야스카(?) 소개 


Written by STG Security 천영철 님이 작성하신 pdf 파일



Introduce Yasca Source Code Analysis Tool_STGSecurity_incle.pdf


(인터넷 검색으로 얻었습니다. 문제가 되면 지우겠습니다. ~)


- 야스카 홈페이지에서 얻은 메뉴얼


yasca-manual.pdf



설치


위치 : http://sourceforge.net/projects/yasca/files/Yasca%202.x/Yasca%202.1/


현재는 2.1버전이 최신


yasca-2.1.zip



압축을 풀면 윈도우즈 용 exe 파일이 존재하고


path 설정 후


             set SA_HOME=c:\static-tools\

             yasca <target directory>



위의 기본 파일 이외에는 추가 라이브러리이며,


설치 파일에는


새로 받은 라이브러리 파일들을 위의 yesca-2.1.zip 파일의 압축 푼 곳에 같이 풀면 된다고 정의함.



추가 플러그인..



yasca-2.1-cppcheck.zip


yasca-2.1-fxcop.zip


yasca-2.1-javascriptlint.zip


yasca-2.1-jlint.zip


yasca-2.1-phplint.zip


yasca-2.1-pixy.zip


yasca-2.1-rats.zip


yasca_clamav_pmd_findbugs.z01


yasca_clamav_pmd_findbugs.z02


yasca_clamav_pmd_findbugs.z03


yasca_clamav_pmd_findbugs.z04


yasca_clamav_pmd_findbugs.z05


yasca_clamav_pmd_findbugs.z06


yasca_clamav_pmd_findbugs.z07


yasca_clamav_pmd_findbugs.z08


yasca_clamav_pmd_findbugs.z09


yasca_clamav_pmd_findbugs.z10


yasca_clamav_pmd_findbugs.zip





반응형
반응형

Java 성능 모니터링에 대해 모르고 있던 5가지 사항, Part 1



JConsole과 VisualVM을 사용한 Java 성능 프로파일링

Ted Neward, Principal, Neward & Associates

요약:  잘못된 코드(또는 잘못된 코드의 작성자)를 비난하는 것은 성능 병목 현상을 찾아내고 Java™ 애플리케이션의 속도를 향상시키는 데 아무런 도움이 되지 않으며 그 어느 것도 추측할 수 없습니다. 이 기사를 통해 Ted Neward는 Java 성능 모니터링 도구에 대한 관심을 촉구하고 있으며 먼저 Java 5의 내장 프로파일러인 JConsole을 사용하여 성능 데이터를 수집 및 분석하는 방법에 대한 5가지 팁을 소개합니다.

이 기사에 태그:  성능, 애플리케이션_개발

원문 게재일:  2010 년 6 월 29 일 번역 게재일:   2010 년 11 월 02 일 
난이도:  초급 영어로:  보기 PDF:  A4 and Letter (28KB | 7 pages)Get Adobe® Reader® 
페이지뷰:  3707 회 
의견:   0 (보기 | 의견 추가 - 로그인)

평균 평가 등급 3 개 총 2표 평균 평가 등급 (2 투표수)
아티클 순위

이 시리즈의 정보

Java 프로그래밍에 대해 알고 있다고 생각하는가? 하지만 실제로는 대부분의 개발자가 작업을 수행하기에 충분할 정도만 알고 있을 뿐 Java 플랫폼에 대해서는 자세히 알고 있지 않다. 이 시리즈에서 Ted Neward는 Java 플랫폼의 핵심 기능에 대한 자세한 설명을 통해 까다로운 프로그래밍 과제를 해결하는 데 도움이 되는 알려져 있지 않은 사실을 밝힌다.

애플리케이션 성능이 나쁠 경우 많은 개발자는 공황 상태에 빠지고 만다. 그리고 이러한 성능 저하에는 합당한 이유가 있기 마련이다. Java 애플리케이션 병목 현상의 소스를 추적하는 작업은 역사적으로 매우 어려운 작업 중 하나이다. 왜냐하면 Java 가상 머신에 블랙박스 효과가 있을 뿐만 아니라 전통적으로 Java 플랫폼용 프로파일링 도구가 부족하기 때문이다.

하지만 Java 5에서 JConsole이 등장하면서 모든 것이 바뀌었다. JConsole은 명령행과 GUI 쉘에서 작동하는 내장 Java 성능 프로파일러이다. 이 프로파일러는 완벽하지는 않지만 지식이 풍부한 책임자가 성능 문제점을 지적할 때 적절하게 대응할 수 있는 방법을 제공할 뿐만 아니라 Papa Google에 문의하는 것보다 전체적으로 훨씬 더 좋은 결과를 제공한다.

5가지 사항 시리즈의 이 기사에서는 JConsole(또는 유사한 기능을 그래픽으로 제공하는 VisualVM)을 사용하여 Java 애플리케이션 성능을 모니터링하고 Java 코드의 병목 현상을 추적하는 데 사용할 수 있는 5가지 쉬운 방법을 설명한다.

1. JDK의 내장 프로파일러

많은 Java 개발자가 Java 5 이후로 프로파일러 도구가 JDK에 포함되어 있다는 사실을 모르고 있다. JConsole(또는 최근 Java 플랫폼 릴리스의 경우에는 VisualVM)은 Java 컴파일러처럼 쉽게 실행할 수 있는 내장 프로파일러이다. JDK가 PATH에 있는 명령 프롬프트에서 jconsole을 실행하거나 GUI 쉘에서 JDK 설치 디렉토리로 이동한 후 bin 폴더를 열고 jconsole을 두 번 클릭한다.

프로파일러 도구가 실행되면 실행 중인 Java의 버전과 동시에 실행 중인 다른 Java 프로그램의 수에 따라 연결할 프로세스의 URL을 묻는 대화 상자가 표시되거나 연결할 수많은 다른 로컬 Java 프로세스가 나열되며, 나열된 목록에 JConsole 프로세스 자체가 포함되기도 한다.

JConsole 또는 VisualVM

JConsole은 Java 5 이후 모든 Java 플랫폼 릴리스에 포함되어 있다. VisualVM은 NetBeans 플랫폼을 기반으로 업데이트된 프로파일러이며 Java 6 업데이트 12 이후로 처음 포함되었다. 대부분의 작업 환경이 아직까지 Java 6으로 업그레이드되지 않았기 때문에 이 기사에서는 JConsole에 중점을 두고 설명한다. 하지만 대부분의 팁은 두 프로파일러 모두와 관련된다. (참고: Java 6에 포함되고 있는 VisualVM은 독립형 다운로드이기도 하다. VisualVM을 다운로드하려면 참고자료를 참조한다.)

JConsole 작업하기

Java 5에서 Java 프로세스는 기본적으로 프로파일링되도록 설정되지 않는다. 시동 시에 명령행 인수 -Dcom.sun.management.jmxremote를 전달하면 Java 5 VM이 연결을 열게 되며 그러면 프로파일러가 연결을 찾을 수 있다. JConsole에서 프로세스가 선택되면 프로세스를 두 번 클릭하여 프로파일링을 시작할 수 있다.

프로파일러에는 고유한 오버헤드가 있으므로 이 오버헤드를 먼저 확인하는 것이 좋다. JConsole의 오버헤드를 가장 쉽게 확인하는 방법은 먼저 애플리케이션 자체를 실행한 다음 프로파일러 하에서 애플리케이션을 다시 실행하여 그 차이를 측정하는 것이다. (이 경우 애플리케이션이 너무 크거나 작아서도 안 된다. 필자는 주로 JDK에 포함된 SwingSet2 데모 애플리케이션을 사용한다.) 따라서 필자는 먼저 가비지 콜렉션 회수를 보기 위해 -verbose:gc를 사용하여 SwingSet2를 실행했다. 그런 다음 동일한 애플리케이션을 다시 실행한 후 JConsole 프로파일러를 연결했다. JConsole이 연결된 경우에는 GC 회수 스트림이 지속적으로 발생한 반면 그렇지 않은 경우에는 회수 스트림이 발생하지 않았다. 바로 이러한 차이가 프로파일러의 성능 오버헤드이다.

2. 프로세스에 원격으로 연결하기

웹 애플리케이션 프로파일러는 소켓을 통한 프로파일링용 연결을 가정하므로 원격으로 실행 중인 애플리케이션을 모니터링/프로파일링하도록 JConsole(또는 JVMTI 기반 프로파일러)을 설정하는 간단한 구성만 수행하면 된다.

예를 들어, Tomcat이 "webserver"라는 시스템에서 실행 중이고 JVM에서 JMX를 사용하고 있고 포트 9004를 청취하고 있을 경우 JConsole(또는 기타 JMX 클라이언트)에서 JMX에 연결하려면 "service:jmx:rmi:///jndi/rmi://webserver:9004/jmxrmi"라는 JMX URL이 필요하다.

기본적으로 원격 데이터 센터에서 실행 중인 애플리케이션을 프로파일링하는 데 필요한 항목은 JMX URL이다. (JMX와 JConsole을 사용하여 원격 모니터링 및 관리를 수행하는 방법에 대한 자세한 정보는 참고자료를 참조한다.)

3. 통계 추적하기

타성에 젖지 마라!

일반적으로 애플리케이션 코드의 성능 문제점을 찾는 방법은 매우 다양하지만 몇 가지 형태로 예측할 수 있다. 초기 Java 시절부터 프로그래밍해 온 개발자는 오래된 IDE를 시작한 후 코드 베이스의 주요 부분에 대한 코드 검토를 시작하여 소스에서 익숙한 "빨간색 플래그"(예: 동기화된 블록, 오브젝트 할당 등)를 찾는 경향이 있다. 프로그래밍 경력이 수 년 이내인 개발자는 아마도 JVM에서 지원하는-X 플래그를 자세히 보면서 가비지 콜렉터를 최적화하는 방법을 찾을 것이다. 그리고 초보 개발자라면 코드를 다시 작성하는 일이 없도록 하기 위해 누군가가 JVM의 마술 같은 "make it go fast" 스위치를 찾아놓았을 것을 기대하면서 Google을 검색할 것이다.

이러한 접근 방법 모두 본질적으로 잘못된 방법은 아니지만 일종의 무모한 도전이다. 성능 문제점에 대한 가장 효과적으로 대응하는 방법은 프로파일러를 사용하는 것이다. 그리고 오늘날에는 Java 플랫폼에 프로파일러가 내장되어 있으므로 사용하지 않을 이유가 없다.

JConsole에는 다음 탭을 포함하여 통계 수집에 유용한 여러 가지 탭이 있다.

  • Memory: JVM 가비지 콜렉터의 다양한 힙에 대한 활동을 추적한다.
  • Threads: 대상 JVM의 현재 스레드 활동을 조사한다.
  • Classes: 한 VM에 로드된 총 클래스 수를 검사한다.

이러한 탭(및 연관된 그래프)은 모두 Java 5 이상의 모든 VM이 JVM에 내장된 JMX 서버에 등록하는 JMX 오브젝트의 기능이다. 지정된 JVM에서 사용할 수 있는 전체 Bean 목록이 MBeans 탭에 나열되며, 해당 데이터를 보거나 이러한 조작을 실행하는 데 필요한 제한된 사용자 인터페이스와 일부 메타데이터가 함께 제공된다. (하지만 알림 등록은 JConsole 사용자 인터페이스의 범위에 해당되지 않는다.)

통계 사용하기

Tomcat 프로세스에서 OutOfMemoryError가 지속적으로 발생하고 있다고 가정하자. 어떻게 된 일인지 알아보기 위해 JConsole을 열고 Classes 탭을 클릭한 다음 클래스 수를 계속 살펴본다. 클래스 수가 지속적으로 올라가면 애플리케이션 서버 또는 코드의 어느 부분에선가ClassLoader 누수가 발생하고 있으며 머지 않아 PermGen 공간이 소진될 것이라고 간주할 수 있다. 문제점을 자세히 확인할 필요가 있는 경우에는 Memory 탭을 검사한다.

4. 오프라인 분석을 위해 힙 덤프 작성하기

프로덕션 환경에서는 많은 작업이 빠르게 수행되기 때문에 애플리케이션 프로파일러에 할애할 수 있는 시간이 많지 않을 것이다. 대신 Java 환경의 모든 사항에 대한 스냅샷을 작성하여 저장한 후 나중에 살펴볼 수 있다. JConsole에서 이 작업을 수행할 수 있으며 VisualVM에서는 더 효과적으로 수행할 수 있다.

먼저 MBeans 탭으로 이동한 후 com.sun.management 노드와 HotSpotDiagnostic 노드를 차례로 연다. 그런 다음 Operations를 선택하고 오른쪽 분할창에 있는 "dumpHeap" 단추를 누른다. 첫 번째("String") 입력 상자에 덤프할 파일 이름을 입력하여 dumpHeap에 전달하면 전체 JVM 힙에 대한 스냅샷이 작성되어 해당 파일에 기록된다.

나중에 다양한 상용 프로파일러를 사용하여 파일을 분석하거나 VisualVM을 사용하여 스냅샷을 분석할 수 있다. (VisualVM은 Java 6에서 사용할 수 있으며 독립형 다운로드로도 사용할 수 있다.)

5. JConsole이 최고는 아니다.

프로파일러 유틸리티로서 JConsole이 좋은 도구임에 틀림 없지만 그보다 더 좋은 도구도 있다. 분석 추가 기능이나 멋진 사용자 인터페이스를 갖춘 프로파일러도 있고 기본적으로 JConsole보다 더 많은 데이터를 추적하는 프로파일러도 있다.

JConsole의 진정한 매력은 전체 프로그램이 "평범한 구형 Java"로 작성되어 있다는 것이다. 이는 곧 Java 개발자라면 누구나 이와 같은 유틸리티를 작성할 수 있다는 것을 의미한다. 실제로 JDK에는 JConsole용 새 플러그인을 작성하여 JConsole을 사용자 정의하는 방법을 보여 주는 예제가 포함되어 있다(참고자료 참조). NetBeans를 기반으로 빌드된 VisualVM에서는 플러그인 개념을 훨씬 더 잘 활용한다.

JConsole(또는 VisualVM이나 기타 도구)이 원하는 기능을 제공하지 않거나, 추적하려는 항목을 추적하지 않거나, 원하는 방식으로 추적하지 않을 경우 사용자가 직접 코드를 작성할 수 있다. Java 코드가 너무 복잡해 보일지도 모르지만 언제라도 Groovy, JRuby 또는 기타 JVM 언어를 활용하여 코드를 빠르게 작성할 수 있다.

실제로 가장 필요한 것은 JMX를 통해 연결되는 사용하기 편리한 명령 도구이며, 원하는 데이터를 원하는 방식으로 정확히 추적할 수 있다.

결론

Java 성능 모니터링은 JConsole이나 VisualVM에서 끝나지 않는다. JDK에는 대부분의 개발자가 모르고 있는 수많은 도구가 있다. 이 시리즈의 다음 기사에서는 필요한 성능 데이터를 더 자세히 살펴보는 데 도움이 되는 실험 수준의 몇 가지 명령 도구에 대해 살펴본다. 이러한 도구는 일반적으로 특정 데이터를 중점적으로 다루기 때문에 완전한 프로파일러에 비해 규모가 작은 경량 도구이다. 따라서 성능 오버헤드도 발생하지 않는다.


참고자료

교육

  • "모르고 있던 5가지 사항": Java 플랫폼에 대해 모르는 것이 많았다는 것을 일깨워 주는 이 시리즈에서는 사소하게 여겼던 Java 기술을 유용한 프로그래밍 팁으로 바꿔준다. 

  • "Monitoring and management using JMX"(Sun Microsystems): JMX와 JVM의 내장 인스트루멘테이션 도구를 사용하여 Java 애플리케이션 성능을 모니터링 및 관리하는 방법에 대해 알아보자. 

  • "Mustang JConsole"(Mandy Chung 저, Java.net, 2008년 5월): JConsole Plugin API를 사용하여 사용자 정의 플러그인을 빌드하는 방법에 대해 간략하게 소개한다. 

  • "Acquiring JVM Runtime Information"(Dustin Marx 저, Dustin's Software Development Cogitations and Speculations, 2009년 6월): JConsole과 VisualVM을 포함한 JDK의 내장 모니터링 및 관리 도구에 대한 데모를 볼 수 있다. 

  • "Build your own profiler"(Andrew Wilcox 저, developerWorks, 2006년 3월): Java 5 에이전트 인터페이스와 AOP를 사용하여 사용자 정의 프로파일러인 Java Interactive Profiler를 빌드하는 방법을 보여 준다. 

  • IBM Monitoring and Diagnostic Tools for Java: Health Center는 실행 중인 IBM Java Virtual Machine을 모니터링하는 기능을 제공하는 낮은 오버헤드의 진단 도구이다. 

  • developerWorks Java 기술 영역: Java 프로그래밍과 관련된 모든 주제를 다루는 여러 편의 기사를 찾아보자. 

제품 및 기술 얻기

  • VisualVM은 여러 명령행 JDK 도구와 경량 프로파일링 기능을 통합한 비주얼 도구이다. 

토론

필자소개

Ted Neward는 글로벌 컨설팅 업체인 ThoughtWorks의 컨설턴트이자 Neward & Associates의 회장으로 Java, .NET, XML 서비스 및 기타 플랫폼에 대한 컨설팅, 조언, 교육 및 강연을 한다. 워싱턴 주의 시애틀 근교에 살고 있다.


반응형
반응형

흠...


어느날 갑자기...

Jennifer으로 떨어진 profile.txt 파일에서

특정 구문만을 분석할 일이 발생했따...

즉,

많이 호출되는 PKG의 ARGUMENT의 내용을 검색하고 싶어졌다

후후... 한 시간동안 대충 만든거라 수정이 필요하지만.

기록상 남겨둔다

예를들면...

stringAnalyzer.sh PKG_NUM.ALL profile.txt D 5

profile.txt 파일에서  PKG_NUM.ALL을 호출한 패키지의 아래의 5줄 사이에 param으로 뿌려진 결과를 출력함.

#!/bin/ksh

##############################################################################################################
#
# 문자열 분석 쉘
#
# 용도 : 제니퍼 로그에서 특정 구문의 호출되는 인자값을 찾기 위한 용도 (반복 패턴 및 호출되는 형태 분석을 위해)
#
#
#
#
##############################################################################################################


if [ $# -eq 0 ]; then
        echo ""
        echo "문자열 분석 쉘"
        echo "=================================================="
        echo "$0 FindText TargetFile Position Number "
        echo "=> FindText   : 찾으려는 문구를 입력함"
        echo "=> TargetFile : 대상 파일"
        echo "=> Position   : D(아래쪽)"
        echo "=> Number     : 아래의 몇줄 안에 param 구문 모두 출력"
        echo ""

else
  

        # 1. 해당 Argument 별로 유효한지 먼저 체크 필요
        # echo abc | tr "[a-z]" "[A-Z]" (대문자 변경  출력)


        # 1. 검색하려는 문자가 들어있는 열을 출력함.
        FindTxt=`grep -n $1 $2 | awk '{print $1}' | sed 's/://g'`

        # 2. 상향인지 하향인지 구분 변수
        UpDown=`echo $3 | tr "[a-z]" "[A-Z]"`

        echo "$2 File"
        echo "==============================="
        echo "File Text : $1"
        echo "======================================================================"
        echo ""
        for i in $FindTxt
        do
                #       echo "i : " $i
                #echo $UpDown
                GetRow=$i
                if [ $UpDown = "U" ]; then
                        GetRow=`expr $i - $4`
                elif [ $UpDown = "D" ]; then
                        GetRow=`expr $i + $4`
                else
                        GetRow=`expr $i`
                fi;

                j=0
                while [ $j -le $4 ]
                do
                        GetRow=`expr $i + $j`
                        ExistRow=`head -$GetRow $2 | tail -1 | grep param2: | grep -v grep | wc -l`

                        if [ $ExistRow -ne 0 ]; then
                                ViewRow=`head -$GetRow $2 | tail -1`
                                echo "$ViewRow"
                        fi;

                        j=`expr $j + 1`
                done
        done
fi

반응형

'Language' 카테고리의 다른 글

npm node module 공통 관리하기  (0) 2020.10.28
Inter-process communication  (0) 2014.03.27
우리은행 웹 접근성 가이드 주소  (0) 2011.08.09
빠른 수식 계산법  (0) 2010.03.01
반응형


참고 사이트 (Reference Site)

  1.MAT (Eclipse Memory Analyzer) 메모리 분석 GUI 툴
    http://www.eclipse.org/mat/downloads.php 

  2. IBM Diagnostic Tool Framework for Java Version 1.5
    http://www.ibm.com/developerworks/java/jdk/tools/dtfj.html  

  3.일본 MAT 적용 참고 사이트   
     http://d.hatena.ne.jp/kakku22/20110910/1315646914 
 


heapdump는 시스템 운영 중 항상 발생할 수 있는 문제이며,

빵빵한 시스템에서는 IBM Heap Analyzer를 사용하여 분석한다

다만,

위와 같은 빵빵한(?) 시스템이 지원되지 않는 환경(Windows 32bit)에서는

분석하는 방법이 없을까 많은 고민을 하였고, 찾다보니 아에 방법이 없지만은 않았다.


1. GUI 툴 다운로드
    - 이클립스 사이트에서 dump 분석을 위한 툴을(MAT) 제공한다.
    - 위의 참고사이트 1번 항목을 방문하면 다운로드 가능하다.

 
     - 다운 받은 파일의 압축을 풀고 해당 디렉토이에 들어가면 MemoryAnlyzer.exe와 MemoryAnalyzer.ini 파일등이 보인다.
     - 32bit 환경에서 최대 할당 가능한 heap 사이즈로 로딩 가능하도록 MemoryAnlyzer.ini 파일을 수정한다.

  -vmargs
 -Xmx1372m
 
2. IBM Heapdump 분석을 위해서는 별도의 plug-in을 추가한다.
   (인터넷 검색하면 많은 내용이 나오지만 위의 DTFJ 파일 방식이 대용량의 힙 덤프 분석에는 최고다..)
   - 2번 사이트 방문하여 다운로드 한다.


위의 클릭을 하면 zip 파일을 받을 수 있다.
   
받은 zip 파일을 MAT 압축을 풀은 디렉토리 내에 DTFJ 폴더를 만들어 그안에 복사하여 놓는다.

3. MAT에 Plug-IN 설치
    - MemoryAnlyzer.exe 더블 클릭하여 MAT 를 실행함.
    - 실행화면
     

 
     -  Help -> Install New Software... 실행


   - Add.. 를 크릭하여 설치 가능한 소프트웨어를 추가함.


     - Name에는 명칭을 적고, Location 부분은 우측의 Archive를 클릭하여 다운받은 dtfj-updatesite.zip를 직접 지정함

 
    - Check 후 Next를 클릭 -> Next

 
 - 라이센스 동의 후 Finish 클릭

 

- local 설치이다 보니 보안 땜시 한번더 묻는거임... ok 살포시 눌러줌

 
 - 다시 시작함(Restart Now를 눌러)

 
  - File -> Open Heap Dump... 를 눌러 IBM Heapdump 파일을 선택하여 분석함..

 
나머지 분석과 관련된 상세한 사항은 인터넷 검색 ㄱㄱ 
반응형
반응형
반응형
반응형

출처 : http://logonjava.blogspot.com/2010/04/heap-dump-perm-area-memory-leak.html


Software 특히 Java 언어를 사용하는 Software 개발 조직에 몸담고 있지만, 마흔을 훌쩍 넘긴 나이에 이런 글을 쓰는 것이 적합한지 의심되는데 특히 국내 SW 환경을 고려한다면 몹시 우스꽝스럽다.

이젠 개발팀장도 아니고 개발실장도 아니고 그위의 관리자이지만, 아직 완전히 제품 코드로부터 역할을 분리하지 못했고, 이러한 시간이 많이 걸리고 책임 소재가 불분명한 문제를 해결할 전문 인력을 두고 있지 않기 때문에 결국 직접 하는 경우가 생긴다. 이것은 미흡한 관리 능력의 결과라고 봐도 좋겠다.

개인적으로는 이러한 일이 전혀 나쁘지 않다. 즐거운 Software Life의 하나일 뿐이다.
관리자가 이러한 삽질을 직접 하는 것이 관리 체계를 무너뜨리는 것 아니냐고 묻겠지만...

oh, give me a break.. 나중에 교육교재 만드는 데 도움이 될까해서 하는 관리 행위의 하나라고 봐주기 바람~~ ㅠ_ㅠ;;

perm gen 과 class leak
Permanent Generation 은 young과 old를 구분하는 Generational Collector 방식인 Sun (now, Oracle)의 HotSpot JVM에서 Old generation 중 한 영역이다.
lifetime이 길다고 판단된 object들을 old generation으로 옮겨서 빈번한 gc의 대상이 되지 않도록 하는 것이 generational collector의 기본 아이디어인데 permanent generation은 old 중에서도 거의 gc 대상이 될 일이 없다고 생각되는 object들을 딴 영역에서 관리하겠다는 아이디어의 산물이다.

HotSpot JVM의 Perm Area 에는 주로 자바의 클래스 객체들이나 문자열 상수 풀에 속한 String 객체들이 위치한다.
메모리 leak의 대상이 되는 것은 string constants 보다는 주로 class 객체들이다.

(class 객체는 주로 객체의 타입을 나타내는 클래스나 인터페이스를 표현하는 객체로 타입명 뒤에 .class 라는 literal을 붙임으로써 지칭할 수 있다. 예를 들어 자바 코드에서 String.class 라는 객체는 java.lang.String 이라는 클래스의 타입을 지칭하는 객체이다.)

memory leak이란 보통 reclaim되어야 할 memory space가 reclaim되지 못하고 있는 상황을 뜻하는데 Java와 같이 garbage collector 기능을 내장한 VM에서는 주로 코드 오류로 인해 gc 대상이 되는 객체를 불필요하게 reference(자바에서는 weak reference나 soft reference와 구분하여 strong reference)하는 gc 대상이 아닌 객체들이 존재하기 때문에 발생한다.

perm area 에 위치하는 class 객체들은 classloader에 의해 load 되기 때문에 이 class 객체들이 unload되는 유일한 방법은 classloader가 unload 즉, gc 되는 것이다.

보통 Java VM이 로드될 때 사용되는 classloader들(runtime에 필요한 클래스를 주로 로드하는 system classloader와 classpath에 설정된 클래스들을 로드하는 application classloader 등)은 JVM이 종료할 때까지 gc되지 않기 때문에 여기에서는 관심의 대상이 아니고, 주로 application이 dynamic하게 코드 상에서 만드는 classloader들이 관심의 대상이 된다.

즉, 다시 말해서 "gc되어야 하는 classloader 객체가 어떤 다른 strong object 에 의해 참조되는 것을 찾는 것이 오늘의 주제"이다.

OutOfMemoryError와 heap dump
heap dump 분석은 Java에서 OutOfMemoryError(이하 OOM)가 발생할 경우 원인을 찾기 위해 많이 사용된다.
OOM 시 heap dump를 자동으로 생성하는 HotSpot JVM 옵션이 있는데 이에 관해서는 앞의 다른 blog를 참고하기 바란다.

OOM은 주로 세 가지 경우에 발생한다. 하나는 전체 heap memory 부족, 또하나는 permanent area 부족, 나머지 하나는 native thread를 더 이상 생성할 수 없을 경우이다.

전체 heap memory 부족은 너무 많은 객체를 만들거나 strong reference에 의해 객체 일부가 reclaim 되지 않아서 발생하게 된다. perm area 부족은 앞과 동일한 이유이겠지만 해당 객체가 class 객체인 경우이고 전체 heap 영역 중 perm 영역이 분리되어 있기 때문에 다르게 발생하는 것이다. thread를 생성 못하는 이유는 OS 환경과 상관이 있을 테고, 또 코드 수준에서 thread를 지나치게 많이 만들거나 또 thread 종료가 제대로 안되어 leak이 발생한 때문일 것이다.

세 가지 중 어느 원인으로 OOM이 발생했는지에 대해선 OOM 에러의 메시지를 보면 쉽게 알수 있다.

heap dump 분석에 필요한 소프트웨어
heap dump 분석을 위해 사용하는 소프트웨어는 다음과 같다.
먼저 heap dump 분석 프로그램. HP에서 제공하는 jmeter 가 있고, IBM에서 제공하는 HeapAnalyzer, SAP에서 만들었다가 지금은 eclipse에 donate된 MemoryAnalyzer 등이 있다.

다들 한번씩 try는 해봤지만 지금은 swing 기반으로 된 순수 자바 프로그램인 IBM HeapAnalyzer를 쓴다.
jmeter는 예쁘게 생겼지만 지원하는 heap dump 포맷이 제약이 있었고, SAP MemoryAnalyzer는 적은 메모리로 큰 dump 파일을 읽어들일 수 있긴 하지만, 제공해주는 정보들을 이해하기 좀 어려웠다.
그러다보니 IBM HeapAnalyzer에 익숙해져버렸다.

또, 하나 많이 사용하는 것은 X 서버이다. PC 환경에서 heap analyzer를 돌리기엔 heap dump 파일이 너무 커서 메모리를 많이 사용하기 때문에 대용량 heap을 사용할 수 있는 64비트 JVM 환경(32비트 JVM에서는 max heap size를 1.4기가 정도밖에 줄 수 없다. 정확한 최대값은 모르겠음)에서 heap analyzer를 실행해야 했는데 그러다보니 PC용 X 서버가 필요했다.

요즘 사용하는 PC용 X 서버는 free open source인 cygwin-x 이다. 큰 문제 없이 쓸 수 있다.



HeapAnalyzer 실행
요즘 개발자들은 X 환경을 이해 못하는 경우가 많아서 간단하게 PC용 X 서버에서 원격지의 heap analyzer를 어떻게 실행하는지 절차를 적어본다. (예전에 motif application 개발을 잠깐 했었던 추억이 있음)

유닉스에서 주로 사용되는 윈도우 시스템인 X-Window 시스템은 서버/클라이언트 구조로 되어 있으며 X 서버는 display를 제공하는 쪽을 뜻하고, 실제 애플리케이션 프로세스가 실행되는 쪽이 X 클라이언트가 된다.

1. X 서버인 cygwin-x를 PC에서 실행하고 xterm 프로그램을 하나 실행시킨다.

2. xterm의 shell prompt 에서 "xhost +" 명령을 실행한다. xhost는 X 서버에 접속할 수 있는 X 클라이언트 호스트들에 대한 접근 제어를 하는 명령이다. cygwin-x가 PC에서 실행되고 원격지 유닉스 서버에서 heap analyzer를 띄울 것이므로 PC가 X 서버이고 유닉스 서버가 X 클라이언트 호스트이다. xhost + 다음에 호스트 명을 주지 않으면 모든 호스트에 대해서 allow한다는 뜻이다.
다음과 같이 불평할 것이다.

[mypc]/home/yoonforh 504> xhost +
access control disabled, clients can connect from any host

3. 해당 유닉스 서버로 telnet 등을 통해 접근한다.
해당 유닉스 서버의 셸에서 DISPLAY 환경 변수를 cygwin-x가 실행된 PC로 지정해야 한다.
예를 들면 ksh이나 bash에서 다음과 같이 지정한다.

export DISPLAY=<PC IP 주소>:0

보통의 X용 appliation은 실행시 -display 옵션을 통해서 지정할 수도 있다. DISPLAY 환경변수 값은 ip 주소와 display screen 번호로 구성된다.

보통 기본값인 0 혹은 0.0을 screen number로 사용한다. 윈도우 시스템 위에 실행되는 window manager 프로그램에 따라 CDE나 gnome-desktop, mwm, twm 등은 여러 개의 screen을 가지므로 screen number를 0이 아닌 다른 값으로 지정할 수도 있다. 사실 대부분의 X용 윈도우 매니저들은 multi screen을 지원한다.
사족이 길어졌다. 그냥 0번 스크린을 지정한다. ㅠ_ㅠ

4. DISPLAY가 지정된 환경에서 heap analyzer를 실행한다.
해당 셸에서 다음과 같이 heap analyzer를 실행한다. 현재 사용하고 있는 버전은 3.7이다.

jdk 5이상 가능

jdk 6이상.


java -Xmx5G -jar ha37.jar

큰 heap dump 파일을 분석할 때에는 메모리가 많이 사용되므로 heap 최대값을 5G로 줬다. dump 파일 크기에 따라 더 줘야 할 경우도 있을 것이다. 앞에서 얘기했듯이 이 JVM이 64비트인 경우에 주로 지원된다. OS나 JVM 버전, 비트 수마다 지원하는 최대 heap 크기가 다르므로 이 부분은 알아서들 체크하기 바란다.

사족이 길었지만 이 application을 remote에서 띄워보려고 했다. 매번 연구원들에게 일일이 이런 것 가이드하기 싫어서 교육용으로 부연해보았다. cygwin-x 위에 뜬 heap analyzer 아마도 상당히 촌스럽다고 느낄 것이다. 뭐, 잘생겼다고 일 잘하는 건 아니다.

5. heap dump 파일을 읽어들인다.
보통 HotSpot JVM에서 binary format으로 heap dump를 남기게 하면 heap analyzer는 "HPROF binary"라는 포맷으로 읽어들인다.
perm area 부족으로 인한 OOM인 경우는 전체 heap 부족으로 인한 OOM인 경우보다는 heap size가 작으므로 dump 파일도 상대적으로 작다. (이것도 다행이라고 생각하면 되려나 ㅎㅎ)

dump 파일이 클수록 읽는 데 시간이 많이 걸리므로 open 시켜 놓고 다른 일을 하면 되겠다. 어차피 프로세싱은 원격지 서버에서 일어나는 것이니 PC에 몹쓸 짓은 안한다.

Object Reference 관계와 ClassLoader 간 계층 관계
이제 분석할 준비가 완료되었다. 몇 가지 필요한 사전 지식에 대해 언급해본다.

ClassLoader는 계층 구조를 가진다. 이 계층 구조는 ClassLoader를 생성할 때 반드시 부모 ClassLoader를 지정하도록 되어 있는데, 기본적인 자바의 class 정의 검색 방식은 부모 ClassLoader에 정의된 class 정의를 우선으로 찾고, 그 다음에 자식 ClassLoader에 정의된 class 정의를 찾는 구조이다.

자바의 각 ClassLoader들은 내부적으로 parent 라는 멤버 필드를 가지고 있고, 이 값이 부모 클래스로더 객체가 된다.
(classloader들의 parent/chlid 관계는 class inheritance의 parent class, child class와는 아무 상관이 없다.)

Object Reference 관계는 객체 간의 참조 구조를 나타내며 directed graph 형태이다. 즉, 참조자(Referencer)를 시작점으로 피참조자(Referencee)를 끝점으로 하나의 화살표가 그려지는 단방향 그래프 형태라고 생각할 수 있다.

표준적인 용어인지는 모르겠지만, HeapAnalyzer에서는 참조자를 parent, 피참조자를 child로 표현하고 있다. 그리고, parent가 없이 strong object인 경우를 root 라고 표현하고 있다.

즉, 단방향 그래프로 이루어진 forest 형태이지만 이것을 root node가 여러 개인 tree인 것으로 표현하고 있다. 생각해보면 root node들 위에 공통된 가상의 parent node 하나가 있다고 가정하면 하나의 tree로 볼 수 있다. 이렇게 보면 parent/child 용어는 적합하다고도 볼 수 있다. (엄밀하게 보면 상호 참조나 순환 참조가 가능하기 때문에 forest나 tree라고 볼 수 없다. 하지만, 여기에서 얘기하는 parent/child 관계를 적용하는 데는 큰 무리가 없으므로 child가 parent로도 되는 경우나 descendant가 ancestor의 parent가 되는 경우가 존재한다는 것을 예외로 간주하고 rough하게 metaphor를 적용해보자.)

이제 ClassLoader 간 parent/child 관계가 Object Reference 관계에서 어떤 관계를 가지는지 생각해보자. 이게 아마 이 논의의 핵심일 것이다.

Child ClassLoader 객체는 멤버 필드로 parent를 가지고 있으며 이 parent 필드의 값이 Parent ClassLoader 객체이다.
즉, Object Reference 관계로 보면 child classloader 객체가 parent란 필드를 통하여 parent classloader를 reference하고 있다.

다시 말하면 object reference 관계에서는 child classloader 가 referencer(parent), parent classloader가 referencee(child)로 되어 parent/child 관계가 뒤바뀐다.

용어적인 유사성 때문에 혼란이 오는 것이며 서로 관련없는 관계이지만, 결과적으로는 "일반적으로 classloader 객체 간 parent/child 관계는 객체 참조간 parent/child 관계와 반대가 된다"고 생각해도 되겠다.

분석 예
이제 실 예를 들어 perm leak을 찾아보자. 사실 perm leak 이 발생하려면 ClassLoader를 동적으로 만들어 사용하는 프로그램에서 가능하기 때문에 일반적인 application에서는 이런 경우가 많지 않다. 보통은 그냥 클래스를 많이 사용하는 경우이므로 JVM 옵션으로 perm area 영역을 늘려주면 된다.

하지만, plugin 과 같은 동적 프로그램 기능을 가지고 있는 application에서는 plugin을 위한 ClassLoader를 만들어 사용하기 때문에 이러한 경우가 종종 발생한다.

먼저 heap dump 파일을 HeapAnalyzer로 연 다음 "Analysis/Search Name" 기능을 사용하여 의심이 가는 클래스로더 객체를 찾는다. 클래스 명으로 찾을 수 있는데 dump 상에는 separator가 '.'이 아니라 '/'인 점을 주의하여 찾는다.


검색 결과를 보면 해당하는 타입의 객체와 클래스 객체가 나타난다. 아래 그림에서 클래스로더 객체는 12개가 존재한다. (13개 중 한 개는 클래스로더 타입을 나타내는 class 객체)


위 그림에서 보이듯이 각 클래스로더 객체를 선택하여 오른쪽 마우스 버튼(두번째 마우스 버튼)을 클릭하면 팝업 메뉴가 보이며 이를 통해 해당 객체의 parent 객체들이나 child 객체들을 추적할 수 있다.

클래스로더 객체를 참조하고 있는 객체 즉, object reference 관계에서 parent에 있는 객체들이 클래스로더 객체의 가비지 컬렉션을 막고 있는 상황을 찾아야 하므로, 계속해서 "List parents" 기능을 사용하여 object reference tree를 거슬러 올라가보면 문제가 되는 참조자 객체를 찾을 수 있을 것이다.

경우에 따라서는 parent 객체들이 sun/reflect/DelegatingClassLoader, java/security/ProtectionDomain, java/lang/Package 등만 나타나는 경우가 있는데 이런 객체들은 일시적인 참조이며, 이 경우는 garbage collection되기를 기다리고 있는 경우이기 때문에 leak이 아니다.

각 객체별로 parent를 추적해보면 알 수 있지만, ProtectionDomain 객체와 Package 객체는 ClassLoader 와 상호참조되는 객체들이며 다른 strong reference에 의해 연결되지 않으며 DelegatingClassLoader는 HotSpot JVM 에서 reflection을 사용하여 dynamic proxy 객체를 만들 때마다 일시적으로 사용되는 클래스로더이다.

object reference 상의 parent 추적은 여러 depth에 걸쳐 일어날 것이며 해당 클래스의 소스 코드를 알고 있다면 쉽게 연결하여 이해할 수 있을 것이다.


object reference graph 추적은 perm leak이든 일반적인 memory leak이든 동일하게 사용할 수 있다. 다만 여기에서는 classloader 객체가 leak이 되는 경우에 perm area problem이 발생한다는 것을 중심으로 설명하였다.

누구에게든 이 잡다한 내용이 작은 도움이 되길 바라면서...


출처 : http://logonjava.blogspot.com/2010/04/heap-dump-perm-area-memory-leak.html
반응형
반응형

http://www.nstaller.com/products

취약점 자동 분석 프로그램이나.. 무료버젼은 100링크 페이지만 한도...


반응형
반응형

보안 위배 사항을 나열해 주는 점검쉘...

대기업에서 만든 버젼인데...

유출을 걱정했는지,

분석구분은 안들어있고

조회만 하넹...

걍 내가 만든게 더 나을꺼 같다 -_-;

반응형

+ Recent posts