톰캣(java) 아웃오브메모리(java.lang.OutOfMemoryError: GC overhead limit exceeded)


해결 방법




대충 처리하자면 현재 사용중인 메모리중 여유 메모리 어느정도인지 확인해서 더 추가해주기


ㄴ그전에 프로그램상의 메모리 누수는 없는지 확인해야함, 이거는 개발단








 ps -ef | grep java 해서 Xmx 설정이 없으면 자바에 디폴트로 설정된 값으로 할당된 상태이니 아래 명령어를 통해 확인 가능


##아래는 java의 디폴트 사이즈 확인하는명령어 보통 heap사이즈는 실제 물리 메모리의 4분의1 이 할당되는듯


[root@localhost]# java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'


     intx CompilerThreadStackSize                   = 0                                   {pd product}


    uintx ErgoHeapSizeLimit                         = 0                                   {product}


    uintx HeapSizePerGCThread                       = 87241520                            {product}


    uintx InitialHeapSize                          := 257949696                           {product}


    uintx LargePageHeapSizeThreshold                = 134217728                           {product}


    uintx MaxHeapSize                              := 4116709376                          {product}


     intx ThreadStackSize                           = 1024                                {pd product}


     intx VMThreadStackSize                         = 1024                                {pd product}


####




####현재 java 메모리 어느 영역 사용중인지 찍는 로그


java -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC -Xloggc:/root/test.txt


ㄴ값이 항상 일정한것이.... 뭔가 찾아보면 있을꺼같은데 잘 모르겄다..이건 어디에 쓰이는지 더 확인해봐야함


####




카타리나.sh 에 추가 JAVA_OPTS="$JAVA_OPTS -Xms8192M -Xmx8192M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tomcat_oom_dump.txt"




근데 메모리 늘려줘도 oom 발생하면 덤프파일을 통해 분석을 해보자


카타리나.sh에 추가한 JAVA_OPTS 중 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/tomcat_oom_dump.txt" 이부분이 oom 에러 발생할경우 덤프파일 생성하는거






덤프파일 pc로 옮기고 아래에서 분석툴 다운받기


http://www.eclipse.org/downloads/download.php?file=/mat/1.7/rcp/MemoryAnalyzer-1.7.0.20170613-win32.win32.x86_64.zip&mirror_id=1255






오픈 heap 파일 할때 java heap space 에러나면 덤프파일 분석시 사용되는 메모리가 부족해서 발생하는거다.


압축 푼 파일보면 memory analyzer.ini 파일 있는데 거기서 Xmx 값을 2048 혹은 4096으로 늘려준다.


8기가짜리 하는데 8000 주니까 된다. 그럼 pc 메모리가 부족하면 애초에 돌리질 못하냐 ? 아니다. 뭐 하는방법이 있다. 구글링해보면.

'job > was' 카테고리의 다른 글

tomcat ssl 인증서 설치  (0) 2018.08.31

고객 문의중 기존서버에서는 잘되던 sns 내보내기 기능이 새로 구입한 서버에서는 정상적으로 안된다고한다.


http://도메인/bbs/sns_send.php?longurl=http%3A%2F%2F도메인%2Fshop&title=sns=gplus




위와같은 주소로 연결이 되는데 서버로는 연결이 되는듯 하나 아파치 로그에는 찍히지 않는것으로 보아 아파치 문제는 아닌듯 하다.




bbs/sns_send.php 를 살펴보면




  5 $title    =  urlencode(str_replace('\"', '"',$_REQUEST['title']));


  6 $short_url = googl_short_url($_REQUEST['longurl']);


  7 if(!$short_url) {


  8         $short_url = $_REQUEST['longurl'];




위 내용중 6번 라인을 주석하면 정상적으로 작동된다는 글을 구글링을 통해 찾았다. 




실제로 6번 라인 주석하니 sns 내보내기 기능이 정상적으로 작동된다.




그럼 googl_short_url 이라는 함수가 정상적으로 작동되지 않는다는건데...




googl_short_url 이라는 함수 설정은 lib/common.lib.php 파일에 들어가 있다.




2761 // goo.gl 짧은 주소 만들기


2762 function googl_short_url($longUrl)


2763 {


2764     global $config;


2765 


2766     // Get API key from : http://code.google.com/apis/console/


2767     // URL Shortener API ON


2768     $apiKey = $config['cf_googl_shorturl_apikey'];


2769 


2770     $postData = array('longUrl' => $longUrl);




위와같이 




google.com 에서 API 키를 받아와야 한다.




도메인/adm 들어가서 환경설정의 SNS 쪽 확인해보면 구글 짧은주소 API KEY 등록하는부분이 있긴 하지만... 애초에 짧은 주소 기능을 사용 안하게 되면 위 함수와 현재 정상적으로 작동되지 않는 sns 내보기 기능과는 무관한듯 보인다...




결론은 구글링에서 찾은 6번라인 주석하면 해결된다는것은 임시방편(다른쪽에 에러가 있을 수도 있음)에 불과하다...




계속 테스트 해보니




https 로 넘어갈 때 정상적으로 작동을 하지 않는다.




소스 보면 curl 을 통해서 http 혹은 https 로 넘어가는데 .. 확인결과 구서버에는 curl 에 openssl 이 enable 돼 있으나 신 서버는 openssl 의 없다(cURL Information => libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2) 






########curl 재설치#######


상황


cent 5사용중이던 고객사가 cent 6 로 서버 이전




이전중 문제 발생, 원인은 curl 에 openssl 이 적용돼있지 않음




이번주에 위와 똑같은 문제인 고객사 1명 더 있었음


(이사람도 구서버는 잘돼는데 이번에 신서버(구서버 신서버 os 기억안남)


에서는 특정 기능이 안된다는 문의였음)






궁금한점


구서버와 신서버의 curl 달라진건가 ?


아니면  cent 5점대 6점대 버전차이 ?






curl 에 open ssl 기능이 포함돼 있찌 않으면 그 결제모듈? 이런거 통신할때


curl 에 openssl 기능 사용해야되서 문제 있을듯합니다. 




해결은




curl 다운받고 설치 


tar xvfz curl-7.49.0.tar.gz 


cd curl-7.49.0


./configure --prefix=/usr/local/curl


make && make install




기존 curl 백업


cd /usr/lib64


mkdir curl_backup


mv libcurl.so* curl_backup/


cp -a /usr/local/curl/lib/libcurl.* ./




아파치 재시작하면 curl 에 openssl 포함돼있음




##############




위와같이 curl 재설치 하면 


cURL Information => libcurl/7.49.0 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18openssl 들어가있음


##############


위 문제가 아니였다. 개삽질 했다.

localhost로 통신을 해야하는데 iptables로 제일 상단에 해외아이피 차단(!KR 제외한 모든 아이피 차단)을 걸어놨다. 그러면서 127.0.0.1 즉 로컬호스트도 차단이 된거다. 그래서 안됐던거임

iptables -A INPUT -m geoip  ! --source-country KR -j LOG --log-prefix "Input DROP : "




해당 정책으로 인해 차단되는 아이피들을 /var/log/messages 에서 확인할 수 있다.




iptables로 인해 차단되는 패킷을 메세지로그에 찍는거

'job > linux' 카테고리의 다른 글

vi 명령어 옵션  (0) 2018.08.31
libphp5.so: undefined symbol: unixd_config  (0) 2018.08.31
sar 명령어 옵션 설명  (0) 2018.08.31
dell / hp 서버 서비스 태그 확인하기  (0) 2018.08.31
sed 및 awk 사용법  (0) 2018.08.31

+ Recent posts