모바일 오유 바로가기
http://m.todayhumor.co.kr
분류 게시판
베스트
  • 베스트오브베스트
  • 베스트
  • 오늘의베스트
  • 유머
  • 유머자료
  • 유머글
  • 이야기
  • 자유
  • 고민
  • 연애
  • 결혼생활
  • 좋은글
  • 자랑
  • 공포
  • 멘붕
  • 사이다
  • 군대
  • 밀리터리
  • 미스터리
  • 술한잔
  • 오늘있잖아요
  • 투표인증
  • 새해
  • 이슈
  • 시사
  • 시사아카이브
  • 사회면
  • 사건사고
  • 생활
  • 패션
  • 패션착샷
  • 아동패션착샷
  • 뷰티
  • 인테리어
  • DIY
  • 요리
  • 커피&차
  • 육아
  • 법률
  • 동물
  • 지식
  • 취업정보
  • 식물
  • 다이어트
  • 의료
  • 영어
  • 맛집
  • 추천사이트
  • 해외직구
  • 취미
  • 사진
  • 사진강좌
  • 카메라
  • 만화
  • 애니메이션
  • 포니
  • 자전거
  • 자동차
  • 여행
  • 바이크
  • 민물낚시
  • 바다낚시
  • 장난감
  • 그림판
  • 학술
  • 경제
  • 역사
  • 예술
  • 과학
  • 철학
  • 심리학
  • 방송연예
  • 연예
  • 음악
  • 음악찾기
  • 악기
  • 음향기기
  • 영화
  • 다큐멘터리
  • 국내드라마
  • 해외드라마
  • 예능
  • 팟케스트
  • 방송프로그램
  • 무한도전
  • 더지니어스
  • 개그콘서트
  • 런닝맨
  • 나가수
  • 디지털
  • 컴퓨터
  • 프로그래머
  • IT
  • 안티바이러스
  • 애플
  • 안드로이드
  • 스마트폰
  • 윈도우폰
  • 심비안
  • 스포츠
  • 스포츠
  • 축구
  • 야구
  • 농구
  • 바둑
  • 야구팀
  • 삼성
  • 두산
  • NC
  • 넥센
  • 한화
  • SK
  • 기아
  • 롯데
  • LG
  • KT
  • 메이저리그
  • 일본프로야구리그
  • 게임1
  • 플래시게임
  • 게임토론방
  • 엑스박스
  • 플레이스테이션
  • 닌텐도
  • 모바일게임
  • 게임2
  • 던전앤파이터
  • 마비노기
  • 마비노기영웅전
  • 하스스톤
  • 히어로즈오브더스톰
  • gta5
  • 디아블로
  • 디아블로2
  • 피파온라인2
  • 피파온라인3
  • 워크래프트
  • 월드오브워크래프트
  • 밀리언아서
  • 월드오브탱크
  • 블레이드앤소울
  • 검은사막
  • 스타크래프트
  • 스타크래프트2
  • 베틀필드3
  • 마인크래프트
  • 데이즈
  • 문명
  • 서든어택
  • 테라
  • 아이온
  • 심시티5
  • 프리스타일풋볼
  • 스페셜포스
  • 사이퍼즈
  • 도타2
  • 메이플스토리1
  • 메이플스토리2
  • 오버워치
  • 오버워치그룹모집
  • 포켓몬고
  • 파이널판타지14
  • 배틀그라운드
  • 기타
  • 종교
  • 단어장
  • 자료창고
  • 운영
  • 공지사항
  • 오유운영
  • 게시판신청
  • 보류
  • 임시게시판
  • 메르스
  • 세월호
  • 원전사고
  • 2016리오올림픽
  • 2018평창올림픽
  • 코로나19
  • 2020도쿄올림픽
  • 게시판찾기
  • 오유인페이지
    개인차단 상태
    물어라이코스님의
    개인페이지입니다
    가입 : 12-09-25
    방문 : 3120회
    닉네임변경 이력
    회원차단
    회원차단해제
    게시물ID : programmer_12017
    작성자 : 물어라이코스
    추천 : 13
    조회수 : 5597
    IP : 27.117.***.100
    댓글 : 21개
    등록시간 : 2015/07/10 17:16:30
    http://todayhumor.com/?programmer_12017 모바일
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다!
    으헝헝헝헝헝 ㅠㅠㅠㅠㅠㅠ
    정말 프게에서 많은 도움을 받았습니다. ㅠㅠㅠㅠㅠ
    글이 워낙 여러개이고 뒤로 밀린터라...
    결과 보고는 드려야 할 것 같아서요....

    1. 프로그램의 목적
     - HTTP를 통해 제공되는 JSON 데이터를 가져와서 가공후 DB에 저장한다.

    2. 여러가지 사항들
     - 구동 환경은 centos
     - 컴파일러는 gcc
     - C 언어
     - mysql
     - 반복 작업을 무한히 해야하며 빠를 수록 좋지만 상한선은 1초당 20회. (json 데이터 제공측 제한)

    3. 사용된 라이브러리
     - mysql

    4. 프로그램 구동 순서
    1) curl을 이용하여 웹 데이터를 가져온다.
    2) 가져온 데이터를 json object로 만든다.
    3) 데이터를 처리한다.
    4) db에 입력한다.


    5. 대략적인 코드 구성
    main(){
    변수 선언

    for{
    curl에서 데이터 가져옮
    json object로 만듦
    데이터 처리
    (일부)
    for{
    데이터 처리
    db 입력
    }
    db 입력
    }

    mysql_close()
    }

    --> 함수 없음. 그냥 main에서 통짜로 실행


    6. 문제 발생
    - 1차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.5%씩 상승 )
    멍청하게도 모든 변수에 대해 메모리 반환을 하지 않음으로 발생.
    동적 할당으로 선언했던 변수들을 free 로 반환.


    - 2차 메모리 누수 ( 반복문 1건당 메모리 사용량 0.4%씩 상승 )
    그럼에도 불구하고 메모리 누수가 발생함.
    동적할당 했던 변수들을 전부 없애고 고정으로 변경.
    추가로 찾아보니
    json object 로 선언된 변수들을 초기화(?) 해주는 함수를 써줘야 한다고 함.
    전체 for문 하단에 다음과 같이 추가

    if (!jobj){ json_object_put(jobj); }


    - 3차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )
    그럼에도 불구하고 매번 반복문이 반복될때마다 계속해서 메모리 누수 발생.
    찾아보니 curl에도 메모리 누수가 있다고 함.

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    free(resData.response); // url에서 가져온 데이터를 보관하는 변수. 데이터 크기에 따라 동적할당을 하므로 free로 반환해야함.


    - 4차 메모리 누수 ( 반복문 100건당 메모리 사용량 0.1%씩 상승 )
    아직도 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ .. ㅋㅋㅋ.ㅋ.ㅋㅋㅋㅋㅋㅋㅋㅋ............
    이때부터 혹시나 하는 마음에 mysql 관련 함수들에도 메모리 누수가 있나 확인해보았으나 없음.
    오유에서 도움을 받아 valgrind 로 검사를 해보니, 여전히 curl 에서 문제가 있다고 나옴.

    더 구글링 해봐도 정답이 없길래.....
    게으름 부리지 말고 작업들을 함수로 따로 만들기로 함.
    함수 작동이 끝나면 사용했던 메모리는 전부 반환하겠지 뭐! <-- 라는 생각..

    char* get_json(char *url) {
    인자로 넘어온 url에서 데이터를 가져오는 작업
    }


    - 5차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )
    ㅋㅋㅋ......
    이때 오유에서 아예 고정 길이로 데이터를 받아버리라는 조언을 얻음.
    그렇게 코드를 변경 했음에도 (char test[35000];) 여전히 메모리 누수가 발생함.


    - 6차 메모리 누수 ( 반복문 1000건당 메모리 사용량 0.1%씩 상승 )
    차근차근 다시 생각을 해봤는데, 아주 중요한 문제가 있었음.
    새롭게 만든 get_json() 함수에서... 이런 멍청한 부분이 있음.

    char* get_json(){
    데이터 처리
    data = malloc(siezeof(char)*size);
    return data;
    }

    !?

    그렇다고 free(data)를 한 후 return data; 를 할수는 없었기에 머리가 아파짐.

    ㅁㄴ이ㅏ러니ㅏㅇ러니아러미낭러민아럼ㄴ이라ㅓㅁ닝러

    어떻게 해야할까...........

    생각하다가...

    한번도 안해본건데.... 왠지 될거 같다는 생각으로 이렇게 바꿈.


    void get_json(char *url, char **data){
    데이터 처리
    *data = malloc(sizeof(char) * size+1);
    strcpy(data, 처리된데이터);
    return data;
    }

    void main(){
    char *data;
    get_json(url, &data);
    jobj = json_tokener_parse(data); // json 으로 파싱
    free(data);
    }

    -> 데이터를 리턴시킬 문자열 변수를 main에서 선언하고 그 주소를 인자로 넘긴 후,
    get_json함수에서 데이터 길이에 따라 동적 할당을 해주고 데이터 복사 후 함수 종료.

    -> 데이터가 리턴 되었으므로 json object를 만든 다음 바로 free로 메모리 반환.

    7. 결과
    프로그램 실행시 메모리 점유율 0.8%
    10만건을 반복 후 메모리 점유율 0.8%



    도움을 주신 오유 프게 분들께 감사드립니다. (__);
    이제 이걸 멀티 쓰레드로 해보는걸 한번 도전해보려구요 ^-^ 아이고 좋다....

    이 게시물을 추천한 분들의 목록입니다.
    [1] 2015/07/10 17:20:46  211.232.***.252  Hello,World!  138634
    [2] 2015/07/10 17:30:26  220.70.***.121  반복문  243580
    [3] 2015/07/10 17:43:04  112.146.***.247  청새치.  168661
    [4] 2015/07/10 17:46:42  1.221.***.110  유테디어  607183
    [5] 2015/07/10 18:06:48  122.212.***.142  법  78670
    [6] 2015/07/10 18:22:18  121.144.***.207  라면은3분  559172
    [7] 2015/07/10 21:12:45  220.77.***.49  E_Sukmean  495625
    [8] 2015/07/11 05:29:08  125.141.***.110  찬바람™  632129
    [9] 2015/07/11 05:56:28  59.6.***.89  게이지  563594
    [10] 2015/07/11 20:16:21  115.22.***.155  QbsidianH20  214116
    푸르딩딩:추천수 3이상 댓글은 배경색이 바뀝니다.
    (단,비공감수가 추천수의 1/3 초과시 해당없음)

    죄송합니다. 댓글 작성은 회원만 가능합니다.

    번호 제 목 이름 날짜 조회 추천
    233
    오징어 등록기 // 오징어 인증 // 오유 인증 싸이트 입니다. [30] 물어라이코스 15/07/20 20:43 68 6
    232
    php] 가입시 이메일 인증 시스템 구축하기 (?) 질문 [2] 본인삭제금지 물어라이코스 15/07/18 02:30 25 0
    231
    GCC 버전별 링크 [1] 물어라이코스 15/07/17 01:46 37 0
    230
    대리? 공유? 계정 정지에 대한 정확한 사항 입니다. 물어라이코스 15/07/16 20:52 69 1
    뻘글] 몇날며칠을 고생한 메모리 누수를 잡았습니다! [4] 물어라이코스 15/07/10 17:16 47 13
    228
    질문] openmp 멀티 쓰레드! [5] 물어라이코스 15/07/09 05:03 37 0
    227
    잡담] 왜 메모리 누수에 머리를 썩히는지 이제 알았습니다 ㅋㅋ [16] 물어라이코스 15/07/07 17:09 76 0
    226
    이 와중에 벌레 소탕 바랍니다. [신고] 물어라이코스 15/07/05 21:37 62 0
    225
    졸작하고 있는데 ... 이게 뭐하는 건지 모르겠습니다. ㅜㅜ [6] 물어라이코스 15/07/03 17:59 75 0
    224
    c언어 sprintf을 가변적으로 활용하는 방법? [21] 물어라이코스 15/07/02 15:14 38 0
    223
    안타까움에 올리는 직관 후기 (feat. CJ) [1] 물어라이코스 15/07/01 22:14 216 2
    222
    저격할때는 확실한 증거를 가지고 했으면 좋겠습니다. [41] 물어라이코스 15/07/01 21:11 167 1
    221
    PHP 서적 추천 부탁드립니다. (초급 X) [4] 물어라이코스 15/06/25 17:18 20 0
    220
    50만대 게이밍 와우 견적 검토 부탁드립니다! [5] 베스트금지본인삭제금지 물어라이코스 15/06/25 15:19 73 0
    219
    지하철인데 제 앞에 아재분이 계세요 [6] 물어라이코스 15/06/24 22:56 66 2
    218
    재저격] 롤게 사람들 단체 비방 후 사과 없음. [2] 물어라이코스 15/06/17 20:51 130 13
    217
    저격] 특정 게시판 사용자들 비방 후 사과 없음. 물어라이코스 15/06/17 20:50 47 4
    216
    광고유저에 대한 판단 부탁드립니다. [8] 물어라이코스 15/06/15 19:54 102 2
    215
    DB 설계 관련하여 조언 부탁드립니다! [12] 본인삭제금지 물어라이코스 15/06/15 02:34 40 0
    214
    모욕죄 인실X 인증 [3편] [22] 물어라이코스 15/06/14 17:51 143 6
    213
    오징어 등록기 나눔 당첨자 발표! (친추 받아주세요!) [2] 물어라이코스 15/06/08 20:50 53 4
    212
    오징어 검색기 나눔 결과! [7] 물어라이코스 15/06/08 02:27 125 7
    211
    오징어 검색기 싸이트에 저격 기능 도입 관련하여 의견 부탁드립니다. [5] 물어라이코스 15/06/06 16:41 86 3
    210
    오징어 인증제, 저격 관련 기능 의견 부탁드립니다! [3] 물어라이코스 15/06/06 02:45 87 3
    209
    [나눔] 오징어 인증을 하시거나 인증노말 유저 대상 나눔! [3] 베스트금지 물어라이코스 15/06/04 20:56 67 3
    208
    오징어 검색기 1400명 돌파 기념 나눔 !!! [11] 물어라이코스 15/06/03 23:35 101 24
    207
    포지 자체에 민감하신 분들이 보면 기절할영상.avi [10] 물어라이코스 15/05/27 22:51 248 0
    206
    오유에 뜨는 대리 광고는 바보님이 확인하셔야해요 [2] 물어라이코스 15/05/19 17:44 155 2
    205
    오징어 등록제를 많이 알려주세요! [10] 물어라이코스 15/05/17 23:10 53 12
    204
    오유 채널이 확실히 인력소가 되긴 한거 같네요 물어라이코스 15/05/15 16:17 98 3
    [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [다음10개▶]
    단축키 운영진에게 바란다(삭제요청/제안) 운영게 게시판신청 자료창고 보류 개인정보취급방침 청소년보호정책 모바일홈