SlideShare a Scribd company logo
1 of 10
2012.10




          Java Memory Leak Pattern




   Excellence in Application & Data Governance
Java 의 Memory Leak                 http://blog.dynatrace.com/2009/08/13/java-memory-problems/




© 2012 GTOne. All rights reserved.   2
Case 1 : Field Object Array 관리           ref : Effective Java, Item 6




                                           elements 배열 내에
                                           Object reference가 계속 남아 있음.




© 2012 GTOne. All rights reserved.     3
Case 2 : Field Static Container




      • Static Container 로 사용하는 경우 Object 소멸 시에도 Static Container가 Clear 되지 않아 내부의
        Object Reference가 남아 있게 됨




© 2012 GTOne. All rights reserved.          4
Case 3 : HttpSession and WebApplicationContext Object




      • Session 은 User 가 logout 할때 까지, Application Context 는 Application 이 종료할 때까지,
        Data가 살아 있으므로 명시적으로 제거 하지 않으면 Memory Leak 이 발생
      • Case 2의 특정한 케이스
      • HttpSession 의 경우 가능 하다면 HttpRequest를 이용하여 해당 케이스를 해결 가능.
        – Use HttpRequest to transfer data whenever possible instead of HttpSession. If the objects
          have to be available for longer time, then they can be moved to the business layer. Elements
          in the session must be explicitly removed




© 2012 GTOne. All rights reserved.                    5
Case 4 : ResultSet and Statement Objects




      • Jdbc Connection 을 Memory Pool 을 이용하여 사용하는 경우, 보통 Connection 의 close가 물리적
        Close가 아닌 Pool로의 반환을 의미
      • 이때 Statement 객체와 ResultSet 객에에 대한 Memory Leak 발생




© 2012 GTOne. All rights reserved.           6
Case 5: ThreadLocal Memory Leak
        public class ConnectionUtil .... {
          ...
          /*
          threadLocal을 이용해서 같은 connection을 끊지 않는 이상은 공유
          */
          public static final ThreadLocal<Connection> threadLocal = new
        ThreadLocal<Connection>();
          public Connection getConnection(){
            Connection connection = (Connection)threadLocal.get();
            try{
              if(connection == null){
                connection = dataSource.getConnection();
                threadLocal.set(connection);
              }
              return connection;
            }catch(SQLException e){
              e.printStackTrace();
              throw new DAOException(e.getMessage());
            }
          }
          ...
        }


      • 만일 Thread가 ThreadPool에서 관리되는 형태라면, 명시적으로 ThreadLocal 변수를 제거하지
        않는 경우 Memory Leak 이 발생
      • Example : Jboss 의 DOMUtils 클래스가 Threalocal 변수를 삭제하지 않은 버그가 있었음 ( 1.2.0
        의 버그 1.2.1 에서 fix )




© 2012 GTOne. All rights reserved.                                        7
Case 6 : Thread.stop() and ExecutorService.shutdownNow() (Tomcat )
                                                        ref : http://atin.tistory.com/438




      • Thread.Stop : 무조건 종료 ( 무한 루프 무시 )
      • ExecutoorService.shutdownsNow() : 단순 인터럽트 호출, while(true) 같은 경우가 있다면 종료
        되지 않음.

      • 같은 이유에서 ThreadPool을 이용하여 Thread가 관리 된다면
        – While(true)  while(isInterrupted() ) or while(Thread.currentThread().isInterrupted()) 와 같이
          사용해야함.




© 2012 GTOne. All rights reserved.                    8
기타 참고 사항

      • HashMap 대신 WeakHashMap 사용 : key 에 대한 reference가 유효할 동안만 항목 유지, 객체를
        key 로 하는 경우에 유용.
      • 주기적으로 collectioin 에 new Object를 추가 하는 루틴 검사 ( info 성 )
      • 너무 많은 Class가 Load되거나 큰 Class가 로드되는 경우 : ClassLoad Leaks.
      • String.intern() 메서드( String a = “ddd”;  String a = “ddd”.intern() ) 에 버그가 있었으나 1.4 이후
        fix
      • File.deleteOn
    PMD , MEMORY LEAK관(으로 생각되는) RULE




© 2012 GTOne. All rights reserved.                9
reference




      •   http://java-x.blogspot.kr/2006/03/java-memory-leaks.html
      •   http://www.ibm.com/developerworks/rational/library/05/0816_GuptaPalanki/
      •   Effective Java 2nd Edition
      •   http://atin.tistory.com/438
      •   http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java
      •   http://www.java-tips.org/java-se-tips/java.util/using-weakhashmap-for-listener-lists.html




© 2012 GTOne. All rights reserved.                        10

More Related Content

What's hot

[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http RequestNAVER D2
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기Park JoongSoo
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
Spring 웹 프로젝트 시작하기
Spring 웹 프로젝트 시작하기Spring 웹 프로젝트 시작하기
Spring 웹 프로젝트 시작하기jiseob kim
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttpNAVER D2
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료수홍 이
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)EunChul Shin
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)Chang-Hwan Han
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Woonduk-Kang
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Spring IoC
Spring IoCSpring IoC
Spring IoCSuan Lee
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재Hankyo
 

What's hot (20)

[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
Spring 웹 프로젝트 시작하기
Spring 웹 프로젝트 시작하기Spring 웹 프로젝트 시작하기
Spring 웹 프로젝트 시작하기
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료
 
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)스프링군살없이세팅하기(The way to setting the Spring framework for web.)
스프링군살없이세팅하기(The way to setting the Spring framework for web.)
 
자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)자바9 특징 (Java9 Features)
자바9 특징 (Java9 Features)
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Pinpoint spring_camp 2015
Pinpoint spring_camp 2015Pinpoint spring_camp 2015
Pinpoint spring_camp 2015
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Spring IoC
Spring IoCSpring IoC
Spring IoC
 
Java 기초
Java 기초Java 기초
Java 기초
 
Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재
 
Spring Boot 1
Spring Boot 1Spring Boot 1
Spring Boot 1
 

Viewers also liked

Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기JinKwon Lee
 
Redmine키노트
Redmine키노트Redmine키노트
Redmine키노트명규 장
 
안정적인 서비스 운영 2014.03
안정적인 서비스 운영   2014.03안정적인 서비스 운영   2014.03
안정적인 서비스 운영 2014.03Changyol BAEK
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅Keesun Baik
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기) YoungSu Son
 
라즈베리파이로 보일러 제어하기
라즈베리파이로 보일러 제어하기라즈베리파이로 보일러 제어하기
라즈베리파이로 보일러 제어하기Tai Hoon KIM
 
세미나
세미나세미나
세미나Dongyi Kim
 
Github를 이용한 협동개발 20141001
Github를 이용한 협동개발 20141001Github를 이용한 협동개발 20141001
Github를 이용한 협동개발 20141001BJ Jang
 
JavaScript MEAN 스택
JavaScript MEAN 스택JavaScript MEAN 스택
JavaScript MEAN 스택Tai Hoon KIM
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유knight1128
 
팀 생산성 향상을 위한 Redmine 도입
팀 생산성 향상을 위한 Redmine 도입팀 생산성 향상을 위한 Redmine 도입
팀 생산성 향상을 위한 Redmine 도입Seungyoon Lee
 
[D2]java 성능에 대한 오해와 편견
[D2]java 성능에 대한 오해와 편견[D2]java 성능에 대한 오해와 편견
[D2]java 성능에 대한 오해와 편견NAVER D2
 
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기Baekjoon Choi
 
SK플래닛_README_마이크로서비스 아키텍처로 개발하기
SK플래닛_README_마이크로서비스 아키텍처로 개발하기SK플래닛_README_마이크로서비스 아키텍처로 개발하기
SK플래닛_README_마이크로서비스 아키텍처로 개발하기Lee Ji Eun
 
기술적 변화를 이끌어가기
기술적 변화를 이끌어가기기술적 변화를 이끌어가기
기술적 변화를 이끌어가기Jaewoo Ahn
 
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)Amazon Web Services Korea
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance TuningJi-Woong Choi
 

Viewers also liked (18)

About garbage collection
About garbage collectionAbout garbage collection
About garbage collection
 
Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기Next Javascript ES2015 시작하기
Next Javascript ES2015 시작하기
 
Redmine키노트
Redmine키노트Redmine키노트
Redmine키노트
 
안정적인 서비스 운영 2014.03
안정적인 서비스 운영   2014.03안정적인 서비스 운영   2014.03
안정적인 서비스 운영 2014.03
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
라즈베리파이로 보일러 제어하기
라즈베리파이로 보일러 제어하기라즈베리파이로 보일러 제어하기
라즈베리파이로 보일러 제어하기
 
세미나
세미나세미나
세미나
 
Github를 이용한 협동개발 20141001
Github를 이용한 협동개발 20141001Github를 이용한 협동개발 20141001
Github를 이용한 협동개발 20141001
 
JavaScript MEAN 스택
JavaScript MEAN 스택JavaScript MEAN 스택
JavaScript MEAN 스택
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유
 
팀 생산성 향상을 위한 Redmine 도입
팀 생산성 향상을 위한 Redmine 도입팀 생산성 향상을 위한 Redmine 도입
팀 생산성 향상을 위한 Redmine 도입
 
[D2]java 성능에 대한 오해와 편견
[D2]java 성능에 대한 오해와 편견[D2]java 성능에 대한 오해와 편견
[D2]java 성능에 대한 오해와 편견
 
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
나는 어떻게 알고리즘을 공부했을까? + 신기한 방법으로 문제 풀어보기
 
SK플래닛_README_마이크로서비스 아키텍처로 개발하기
SK플래닛_README_마이크로서비스 아키텍처로 개발하기SK플래닛_README_마이크로서비스 아키텍처로 개발하기
SK플래닛_README_마이크로서비스 아키텍처로 개발하기
 
기술적 변화를 이끌어가기
기술적 변화를 이끌어가기기술적 변화를 이끌어가기
기술적 변화를 이끌어가기
 
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)
마이크로서비스 아키텍처와 DevOps 기술 - Amazon 사례를 중심으로 (윤석찬)
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning
 

Similar to 자바 메모리 릭 패턴

토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료ssuser776e2d
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피ssuser776e2d
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm엑셈
 
7가지 동시성 모델-2장
7가지 동시성 모델-2장7가지 동시성 모델-2장
7가지 동시성 모델-2장Sunggon Song
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.Hyung Eun Jin
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdfSeokju Hong
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XpressEngine
 
11장 시스템
11장 시스템11장 시스템
11장 시스템kidoki
 
Java_Concurrency_Programming_SYS4U
Java_Concurrency_Programming_SYS4UJava_Concurrency_Programming_SYS4U
Java_Concurrency_Programming_SYS4Usys4u
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring frameworkHaeil Yi
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 

Similar to 자바 메모리 릭 패턴 (20)

토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
JVM Synchronization_Wh apm
JVM Synchronization_Wh apmJVM Synchronization_Wh apm
JVM Synchronization_Wh apm
 
7가지 동시성 모델-2장
7가지 동시성 모델-2장7가지 동시성 모델-2장
7가지 동시성 모델-2장
 
Java 8 고급 (3/6)
Java 8 고급 (3/6)Java 8 고급 (3/6)
Java 8 고급 (3/6)
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.RequireJS를 이용한 모듈관리.
RequireJS를 이용한 모듈관리.
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
XE 오픈 세미나(2014-04-26) - 김동현 "XE 코어 구조론"
 
React js 1
React js   1React js   1
React js 1
 
[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
11장 시스템
11장 시스템11장 시스템
11장 시스템
 
Java_Concurrency_Programming_SYS4U
Java_Concurrency_Programming_SYS4UJava_Concurrency_Programming_SYS4U
Java_Concurrency_Programming_SYS4U
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 

자바 메모리 릭 패턴

  • 1. 2012.10 Java Memory Leak Pattern Excellence in Application & Data Governance
  • 2. Java 의 Memory Leak http://blog.dynatrace.com/2009/08/13/java-memory-problems/ © 2012 GTOne. All rights reserved. 2
  • 3. Case 1 : Field Object Array 관리 ref : Effective Java, Item 6 elements 배열 내에 Object reference가 계속 남아 있음. © 2012 GTOne. All rights reserved. 3
  • 4. Case 2 : Field Static Container • Static Container 로 사용하는 경우 Object 소멸 시에도 Static Container가 Clear 되지 않아 내부의 Object Reference가 남아 있게 됨 © 2012 GTOne. All rights reserved. 4
  • 5. Case 3 : HttpSession and WebApplicationContext Object • Session 은 User 가 logout 할때 까지, Application Context 는 Application 이 종료할 때까지, Data가 살아 있으므로 명시적으로 제거 하지 않으면 Memory Leak 이 발생 • Case 2의 특정한 케이스 • HttpSession 의 경우 가능 하다면 HttpRequest를 이용하여 해당 케이스를 해결 가능. – Use HttpRequest to transfer data whenever possible instead of HttpSession. If the objects have to be available for longer time, then they can be moved to the business layer. Elements in the session must be explicitly removed © 2012 GTOne. All rights reserved. 5
  • 6. Case 4 : ResultSet and Statement Objects • Jdbc Connection 을 Memory Pool 을 이용하여 사용하는 경우, 보통 Connection 의 close가 물리적 Close가 아닌 Pool로의 반환을 의미 • 이때 Statement 객체와 ResultSet 객에에 대한 Memory Leak 발생 © 2012 GTOne. All rights reserved. 6
  • 7. Case 5: ThreadLocal Memory Leak public class ConnectionUtil .... { ... /* threadLocal을 이용해서 같은 connection을 끊지 않는 이상은 공유 */ public static final ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); public Connection getConnection(){ Connection connection = (Connection)threadLocal.get(); try{ if(connection == null){ connection = dataSource.getConnection(); threadLocal.set(connection); } return connection; }catch(SQLException e){ e.printStackTrace(); throw new DAOException(e.getMessage()); } } ... } • 만일 Thread가 ThreadPool에서 관리되는 형태라면, 명시적으로 ThreadLocal 변수를 제거하지 않는 경우 Memory Leak 이 발생 • Example : Jboss 의 DOMUtils 클래스가 Threalocal 변수를 삭제하지 않은 버그가 있었음 ( 1.2.0 의 버그 1.2.1 에서 fix ) © 2012 GTOne. All rights reserved. 7
  • 8. Case 6 : Thread.stop() and ExecutorService.shutdownNow() (Tomcat ) ref : http://atin.tistory.com/438 • Thread.Stop : 무조건 종료 ( 무한 루프 무시 ) • ExecutoorService.shutdownsNow() : 단순 인터럽트 호출, while(true) 같은 경우가 있다면 종료 되지 않음. • 같은 이유에서 ThreadPool을 이용하여 Thread가 관리 된다면 – While(true)  while(isInterrupted() ) or while(Thread.currentThread().isInterrupted()) 와 같이 사용해야함. © 2012 GTOne. All rights reserved. 8
  • 9. 기타 참고 사항 • HashMap 대신 WeakHashMap 사용 : key 에 대한 reference가 유효할 동안만 항목 유지, 객체를 key 로 하는 경우에 유용. • 주기적으로 collectioin 에 new Object를 추가 하는 루틴 검사 ( info 성 ) • 너무 많은 Class가 Load되거나 큰 Class가 로드되는 경우 : ClassLoad Leaks. • String.intern() 메서드( String a = “ddd”;  String a = “ddd”.intern() ) 에 버그가 있었으나 1.4 이후 fix • File.deleteOn PMD , MEMORY LEAK관(으로 생각되는) RULE © 2012 GTOne. All rights reserved. 9
  • 10. reference • http://java-x.blogspot.kr/2006/03/java-memory-leaks.html • http://www.ibm.com/developerworks/rational/library/05/0816_GuptaPalanki/ • Effective Java 2nd Edition • http://atin.tistory.com/438 • http://stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java • http://www.java-tips.org/java-se-tips/java.util/using-weakhashmap-for-listener-lists.html © 2012 GTOne. All rights reserved. 10