2016년 3월 28일 월요일

Java 프로세스 메모리 덤프 및 분석하기

jmap을 이용하여 지정한 Java 프로세스의 메모리를 덤프할 수 있다.

사용법: jmap [option] <pid>
서버 내 실행 중은 Java 프로세스의 pid (Process ID)를 지정. Core dump나 저멀리 있는 서버 내 프로세스의 메모리도 덤프할 수 있다. (jmap 설명서 참고)

[option]에는 다음과 같은 것들이 들어감.
  • -heap : Heap 요약 정보를 표시함.
  • -histo[:live] : 메모리를 할당 받은 java object를 히스토그램으로 표시함. 부가 옵션 live가 지정되면 살아있는 object만 counting 함.
  • -permstat : GC 설명할 때 나오는 Permanent 영역에 대한 통계 정보를 출력함.
  • -finalizerinfo : GC가 되기를 기다리고 있는 object의 정보를 출력.
  • -dump:[live,]format=b,file=<file> : hprof 바이너리 형태의 메모리 덤프 파일을 생성함. live를 넣으면 실제 활동(?) 중인 obejct에 대한 것만 덤프됨.
jmap -dump:format=b,file=a.dump 123 와 같이 실행하면 (123은 PID) 123에 해당하는 java process의 메모리 덤프가 a.dump 파일로 생성된다. 문제는 a.dump는 바이너리 파일이라 그냥 볼 수 없다. 하지만 Eclipse에서 제공하는 메모리 분석 툴로 이 파일을 읽으면 메모리 상태 및 다양한 분석을 할 수 있다. http://www.eclipse.org/mat/ 참고.

추가로 jmap 실행 시 다음과 같이
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
연결할 수 없다는 메시지가 나오면 root 권한으로 실행하면 된다.

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

JVM Thread Dump 생성하기

-XX:OnError="kill -3 %p" --> 오류가 발생했을 때 지정한 명령어가 실행됨.
-XX:OnErrorFile=파일이름 --> JVM에서 발생한 Fatal Error 로그 파일 위치 지정
-XX:+PrintConcurrentLocks --> 스레드 정보 출력 시 Lock의 상태 출력
-XX:+PrintClassHistogram --> 클래스별로 점유하고 있는 메모리 히스토그램 출력

스레드 Dump 생성 방법
1. kill -3 [PID] QUIT 시그널을 보냄. -3이 QUIT인지는 kill 매뉴얼에서 확인해야 함.
2. jstack [PID]
3. Ctrl-\

1이 가능 무난함.
System.out으로 Dump 생성되니 java ##### > $$$$$.txt & 와 같이 실행해 놓아야 함.

스레드 Dump 분석 방법: TDA (Thread Dump Analyzer) 이용. GNU License 공개 툴

ps -Lf -p [PID] --> 프로세스의 스레드까지 확인 가능 (LWP)

출처: 자바 개발자와 시스템 운영자를 위한 트러블 슈팅 이야기 (이상민, 2011)

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2016년 3월 8일 화요일

[Tomcat] tomcat unable to process jar entry ~ for annotations 예외 발생 시

서블릿을 찾으려고 jar 파일을 스캔할 때 발생하는 오류임.
해당 jar 파일이 스캔할 필요가 없는 경우라면,
1. Tomcat 7에서는 catalina.properties에서 tomcat.util.scan.DefaultJarScanner.jarsToSkip 에 해당 jar 파일명 혹은 패턴을 추가함.
2. Tomcat 8에서는 1과 같이 조치하거나, context.xml에서 <JarScanFilter> 부분에 추가하면 됨.

참고: http://wiki.apache.org/tomcat/HowTo/FasterStartUp

저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No

2016년 3월 7일 월요일

netty에서 제공하는 기본 코덱

* base64 코덱

* bytes 코덱: 바이트 배열 데이터레 대한 송수신 지원

* compression 코덱: 송수신 데이터의 압축을 지원하는 코덱. 4.0은 zlib, gzip, Snappy 지원. 4.1은 BZip2, FastLZ, LZ4, LZF 지원 예정

* http 코덱:
HTTP를 지원하는 코덱으로 하위 채키지에서 다양한 데이터 송수신 방법을 지원함.
HTTP 코덱의 세부 구현체로 HTTP의 CORS(Cross Origin Resource Sharing) 송수신을 지원하는 cors 코덱,
파일 송수신과 같은 multipart 요청과 응답을 지원하는 multipart 코덱,
웹 소켓 프로토콜의 데이터 송수신을 지원하는 websocketx 코덱

NOTE: CORS는 현재 접속한 웹 서비스 도메인에서 다른 도메인에 존재하는 URI 호출을 허용하는 것을 말함.

* marshalling 코덱
마샬링: 객체 --> 네트워크 패킷
언마샬링: 네트워크 패킷 --> 객체
JBoss marshalling 라이브러리 이용: http://jbossmarshalling.jboss.org/

* protobuf 코덱
구글의 프로토콜 버퍼를 사용한 데이터 송수신 코덱

* rtsp 코덱
RTSP(Real Time Streaming Protocol). 오디오와 비디오 같은 실시간 데이터를 전달하기 위한 Application 레벨의 프로토콜.
실시간 동영상 스트리밍 제어 프로토콜임.

* sctp 코덱
TCP가 아닌 SCTP 전송 계층을 사용하는 코덱.
Bootstrap의 채널을 NioSctpChannel 혹은 NioSctpServerChannel을 사용해야 함.

* spdy 코덱
구글의 SPDY 프로토콜 지원 코덱.

* string 코덱
문자열 송수신을 지원. 첼넷이나 채팅 서버용 프로토콜에 사용.
netty 예제 중 TelnetServer 참고

* serialization 코덱
자바의 객체를 네트워크로 전송할 수 있도록 직렬화와 역직렬화를 지원하는 코덱.
JDK의 ObjectOutputStream 및 ObjectInputStream과 호환되지 않음!!

출처: 자바 네트워크 소녀 Netty (정경석 저, 한빛미디어)


저작자: Yes, 상업적 이용: No, 컨텐츠 변경: No