• Like
자바 메모리 릭 패턴
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

자바 메모리 릭 패턴

  • 2,575 views
Published

어쩌다 어쩌다 대충 정리 해 본 것... …

어쩌다 어쩌다 대충 정리 해 본 것...

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,575
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
67
Comments
0
Likes
50

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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