JMX Remote 설정 후 Heap dump 추출하기

이미지
Java Mission Control 로 Heap dump 추출하는 방법 1. JVM Browser 탭 에서 Heap dump를 추출하고자 하는 대상 선택 2. MBean Server 클릭 3. MBean Browser 탭 클릭 (우측 하단 두번째 탭) 4. MBean Tree 에서 보이는 폴더명 중 com.sun.management 클릭 5. HotSpotDiagnostic 항목 클릭 6. MBean Tree 우측 창에 MBean Features 에서 Operations 탭 클릭 7. dumpHeap : void 항목 클릭 8. p0와 p1 항목의 value 에 각각  dump 파일명 과  true  값을 지정 9. 하단의 Execute 버튼 클릭하여 dump 파일 생성 및 확인 10. dump 파일은 프로세스의 현재 작업중인 폴더에서 찾을 수 있다.  만약 ps 명령어를 통해 알아낸 pid가 4455라면 pwdx 4455 명령어를 통해  현재 작업중인 폴더를 알아낼 수 있다. 동일한 파일명이 존재할 경우 아래와 같은 에러 발생한다.  파일명 변경 후 execute 하여 생성하면 된다.  refs:  heap dump 추출방법

JMX Remote 설정

이미지
1. 기본 tomcat 에는 JMC 연결을 위한 모듈이 없기 떄문에 catalina-jmx-remote.jar 파일을 다운로드 한다.  나는 Tomcat 8 을 사용하고 있어 아래 링크에서 다운로드 받았다.  자신의 Tomcat 버전에 맞는 파일로 받아서 다운로드 받을것을 권장한다.  주의) Tomcat 8.0.28 버전을 사용하고 있을 때 Tomcat 8 버전의  catalina-jmx-remote.jar 다운로드 받아 실행하였더니  파싱에러가 발생하였다. Tomcat 7 버전의 파일로 다시 받아 실행하였더니 정상적으로 작동하였다.  Tomcat 7과 Tomcat 8 의 catalina-jmx-remote.jar 은 해시값이 다른 즉 동일한 파일이 아니었기 때문에 8.0.28 버전에 일부 반영이 되지 않은 부분이 있었다는 생각이 든다. Tomcat8버전의 jmx파일 다운로드 링크 2. server.xml 에 jmx 리스너 등록 3. jmx 환경설정을 위한 쉘 스크립트 생성 후 실행 (실행권한 줄 것) 4. jmc.exe 파일을 클릭하여 실행 5. 왼쪽 상단의 File > Connect.. 를 클릭하여 신규 연결생성 6. 연결할 서버의 주소와 포트정보 입력 7. 테스트 연결 확인   ( status 가 ok가 아니라면 jmx 리스너 또는 방화벽  확인할 것 ) 8. JMX 콘솔 실행 9. 완료 화면 refs:  https://www.lesstif.com/pages/viewpage.action?pageId=20776824

[MySQL] datetime 의 default value 설정하기

ALTER TABLE "테이블명" MODIFY COLUMN create_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

[Tomcat] java.lang.NoClassDefFoundError: org/springframework/security/taglibs/authz/AuthorizeTag

 서비스가 정상적으로 올라오지 않아 톰캣로그를 확인하던중 아래와 같은 에러를 확인했다. java.lang.NoClassDefFoundError: org/springframework/security/taglibs/authz/AuthorizeTag  톰캣이 오래된 security.tld (태그 라이브러리) 를 캐시하고 있어서 발생하는 문제이다. 해결방법은 톰캣 홈경로에 위치해 있는 work 디렉토리를 지워주고 재시작을 하면 된다.  나의 경우 /usr/local/apache-tomcat/work 에 위치해 있었으며 해당 폴더를 삭제하여 정상작동 하였다. refs : http://stackoverflow.com/questions/7678421/spring-security-3-1-java-lang-classnotfoundexception-org-springframework-securi

[JAVA] String.lengh() VS String.getBytes().length

http://www.pixelstech.net/article/1427944920-String-length()-vs-String-getBytes()-length-in-Java UI 에 response 타입에 content-length 를 String.lengh()로 보냄 길이가 다름. (원래 길이보다 모자르게 감) String.getBytes().length로 해야 일치.

[MySQL] Error Dropping Database (Can't rmdir '.test\', errno: 17)

InnoDB가 깨져서 복구가 불가능해 졌다. 덤프 데이터가 있어서 Database 를 drop 후 다시 생성하려 했지만 아래와 같은 에러가 발생하면서 drop이 되지 않았다.  Error Dropping Database (Can't rmdir '.데이터베이스명\', errno: 17) 위의 에러는 MySQL에서 data 디렉토리에 위치한 Database 관련 디렉토리를 삭제하지 못해서 발생한다. 이러한 경우에는 MySQL에서 Database를 저장하는 디렉토리에 가서 직접삭제를 해주어야 한다. 예를 들어 DB가 설치된 경로가 /usr/local/mysql 이고, drop 하고자 하는 Database가 test 라면 아래와 같이 진행한다. cd /usr/loacl/mysql/data   (Database 가 저장 된 폴더) rm -rf test (test Database 폴더 삭제) mysql 에 접속 create database test; (Database 다시 생성) refs : http://stackoverflow.com/questions/4584458/error-dropping-database-cant-rmdir-test-errno-17

[MySQL] 외부에서 IP로 MySQL로 연결 시 Connection 이 느려지는 현상 해결

 운영하고 있던 서버중 하나에서 DB 연결을 하는데 6초 가량 걸리는 일이 발행하였다. 이전에는 문제가 없었기에 살펴보던 중 MySQL에서 IP로 접속 시 DNS lookup 즉, IP 와 hostname 이 일치하는가를 확인하는 과정에서 연결이 지연될 수 있음을 확인하였다. /etc/my.cnf 파일에 [mysqld] 항목 아래에 --skip-name-resolve 옵션을 추가하여 해결. 주의 : --skip-name-resolve 옵션을 사용한다면, 호스트명 대신 IP로만 접속을 할 수 있다. refs : http://dev.mysql.com/doc/refman/5.7/en/host-cache.html http://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_skip-name-resolve