SlideShare una empresa de Scribd logo
1 de 15
JAVA 内存泄漏及其诊断
@ivannotes
2012-05-04
Agenda

•   什么是内存泄漏
•   一个真实的例子
•   诊断泄漏点
•   利用工具发现泄漏
•   参考资料
•   Q&A
什么是内存泄漏

• JAVA 存在内存泄漏
C 的例子:
int *pi; void foo() {
    pi = (int*) malloc(8*sizeof(int)); // oops, memory leak of 4 ints
    // use pi
    free(pi); // foo() is done with pi
    }
void main() {
    pi = (int*) malloc(4*sizeof(int));
    foo();
    pi[0] = 10; // oops, pi is now a dangling pointer
}
Java 的例子

import   java.io.IOException;
import   java.util.HashSet;
import   java.util.Random;
import   java.util.Vector;

public class LeakExample {
    static Vector myVector = new Vector();
    static HashSet pendingRequests = new HashSet();

    public void slowlyLeakingVector(int iter, int count) {
            for (int i=0; i<iter; i++) {
                         for (int n=0; n<count; n++) {
                                     myVector.add(Integer.toString(n+i));
                         }
                         for (int n=count-1; n>0; n--) {
                                     // Oops, it should be n>=0
                                     myVector.removeElementAt(n);
                         }
            }
    }
Java 的例子

public void leakingRequestLog(int iter) {
            Random requestQueue = new Random();
            for (int i=0; i<iter; i++) {
                         int newRequest = requestQueue.nextInt();
                         pendingRequests.add(new Integer(newRequest));
                         // processed request, but forgot to remove it
                         // from pending requests
            }
    }

    public void noLeak(int size) {
            HashSet tmpStore = new HashSet();
            for (int i=0; i<size; ++i) {
                         String leakingUnit = new String("Object: " + i);
                         tmpStore.add(leakingUnit);
            }
            // Though highest memory allocation happens in this
            // function, but all these objects get garbage
            // collected at the end of this method, so no leak.
    }
Java 的例子

    public static void main(String[] args) throws IOException {
            LeakExample javaLeaks = new LeakExample();
            for (int i=0; true; i++) {
                         try { // sleep to slow down leaking process
                                      Thread.sleep(1000);
                         } catch (InterruptedException e) { /* do nothing */ }
                         System.out.println("Iteration: " + i);
                         javaLeaks.slowlyLeakingVector(1000,10);
                         javaLeaks.leakingRequestLog(5000);
                         javaLeaks.noLeak(100000);
            }
    }
}
什么是内存泄漏

对于 JAVA 来说一个对象被程序使用过后在程序接
下来的生命周期内都不会再使用,那它就是内存
泄漏。因为它已经不会再被用到,但却占用了内
存并且不能被回收。
一个真实的例子

背景:
 该死的 JVM GC 报警短信
诊断泄漏点

•   问题代码

String name = request.getServletPath();
ProfilerPoint profiler = profilerManager.getProfilerPoint(name,domain);

public ProfilerPoint getProfilerPoint(String name,String domain){
     ProfilerPoint point = points.get(name);
     if(point==null){
           point = new ProfilerPoint(name,domain);
           ProfilerPoint old = points.putIfAbsent(name, point);
           if(old!=null)return old;
     }
     return point;
}

    永远只会变大的 points 。因为我们采用了 REST 风格的 URL 所以随着内容的增
    多 URL 的数量会越来越多,这里的统计不应该根据 URL 去统计,个应该根据正
    则的 URL 映射表去统计
利用工具发现泄漏


• 这次的问题中我们用到的工具
jmap
jstat
gc.log
jvisualvm

Other Tools can be used
GCLogViewer
IBM Monitoring and Diagnostic Tools for Java
利用工具发现泄漏


• gc log
  开启 GC log 的方法。在 JVM 中添加如下参数
  -verbose:gc
  -XX:+PrintGCDetails
  -XX:+PrintGCTimeStamps
  -Xloggc:somefile.log
• Jstat
  jstat –gc pid
  jstat –gcutil pid 1000 10
  其中 pid 是 jvm 进程号, jstat –gcutil 1000 是代表每隔 1
  秒执行一次, 10 代表一共执行 10 次
利用工具发现泄漏


•   Jmap
    jmap –histo:live pid
    执行该命令可以打印出当前堆中活着的对象,我们来看看出问题的时候这里
    是什么样子的
利用工具发现泄漏



• Jvisualvm
参考资料

• http://www.ibm.com/developerworks/rational/library

• http://
  www.ibm.com/developerworks/java/jdk/tools/gcmv
  /
• http://www.ibm.com/developerworks/java/jdk/tools/
Q&A

Más contenido relacionado

La actualidad más candente

冲浪 Object-c
冲浪 Object-c冲浪 Object-c
冲浪 Object-cjeff kit
 
Ecma script3
Ecma script3 Ecma script3
Ecma script3 gniavaj
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错jeffz
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇Justin Lin
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
從 Singleton 談 constructor
從 Singleton 談 constructor從 Singleton 談 constructor
從 Singleton 談 constructorLuba Tang
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)jane2006
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望jeffz
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望jeffz
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程zhangdaiping
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorAdy Liu
 
Lua 语言介绍
Lua 语言介绍Lua 语言介绍
Lua 语言介绍gowell
 

La actualidad más candente (20)

冲浪 Object-c
冲浪 Object-c冲浪 Object-c
冲浪 Object-c
 
Ecma script3
Ecma script3 Ecma script3
Ecma script3
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
Wind.js无障碍调试与排错
Wind.js无障碍调试与排错Wind.js无障碍调试与排错
Wind.js无障碍调试与排错
 
OpenEJB - 另一個選擇
OpenEJB - 另一個選擇OpenEJB - 另一個選擇
OpenEJB - 另一個選擇
 
论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 
JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程
 
從 Singleton 談 constructor
從 Singleton 談 constructor從 Singleton 談 constructor
從 Singleton 談 constructor
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 
Node way
Node wayNode way
Node way
 
ios分享
ios分享ios分享
ios分享
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
 
Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望Jscex:案例、阻碍、体会、展望
Jscex:案例、阻碍、体会、展望
 
Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望Jscex:案例、经验、阻碍、展望
Jscex:案例、经验、阻碍、展望
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程基于原型的JavaScript面向对象编程
基于原型的JavaScript面向对象编程
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
 
Closure
ClosureClosure
Closure
 
Lua 语言介绍
Lua 语言介绍Lua 语言介绍
Lua 语言介绍
 

Destacado

Java性能调优浅谈
Java性能调优浅谈Java性能调优浅谈
Java性能调优浅谈jxqlovejava
 
Java Garbage Collection(GC)- Study
Java Garbage Collection(GC)- StudyJava Garbage Collection(GC)- Study
Java Garbage Collection(GC)- StudyDhanu Gupta
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
Java 性能瓶劲分析之最佳实践
Java 性能瓶劲分析之最佳实践Java 性能瓶劲分析之最佳实践
Java 性能瓶劲分析之最佳实践Denger Tung
 
服务器端性能优化
服务器端性能优化服务器端性能优化
服务器端性能优化ZhiYong Wei
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查bluedavy lin
 
Java gc
Java gcJava gc
Java gcNiit
 
Java GC Tuning
Java GC TuningJava GC Tuning
Java GC Tuningpprun
 
Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成zhongbing liu
 
What you need to know about GC
What you need to know about GCWhat you need to know about GC
What you need to know about GCKelum Senanayake
 
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationGC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationLudovic Poitou
 
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»Вячеслав Блинов «Java Garbage Collection: A Performance Impact»
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»Anna Shymchenko
 
JDK Tools For Performance Diagnostics
JDK Tools For Performance DiagnosticsJDK Tools For Performance Diagnostics
JDK Tools For Performance DiagnosticsBaruch Sadogursky
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享elevenma
 
用 Python 打造你自己的 summly
用 Python 打造你自己的 summly用 Python 打造你自己的 summly
用 Python 打造你自己的 summlyAndy Dai
 
Java gc and JVM optimization
Java gc  and JVM optimizationJava gc  and JVM optimization
Java gc and JVM optimizationRajan Jethva
 

Destacado (20)

Java性能调优浅谈
Java性能调优浅谈Java性能调优浅谈
Java性能调优浅谈
 
Java Garbage Collection(GC)- Study
Java Garbage Collection(GC)- StudyJava Garbage Collection(GC)- Study
Java Garbage Collection(GC)- Study
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
Java 性能瓶劲分析之最佳实践
Java 性能瓶劲分析之最佳实践Java 性能瓶劲分析之最佳实践
Java 性能瓶劲分析之最佳实践
 
服务器端性能优化
服务器端性能优化服务器端性能优化
服务器端性能优化
 
Java常见问题排查
Java常见问题排查Java常见问题排查
Java常见问题排查
 
JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
 
Java gc
Java gcJava gc
Java gc
 
[BGOUG] Java GC - Friend or Foe
[BGOUG] Java GC - Friend or Foe[BGOUG] Java GC - Friend or Foe
[BGOUG] Java GC - Friend or Foe
 
Java GC Tuning
Java GC TuningJava GC Tuning
Java GC Tuning
 
Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成Thrift+scribe实现分布式日志收集,并与log4j集成
Thrift+scribe实现分布式日志收集,并与log4j集成
 
How long can you afford to Stop The World?
How long can you afford to Stop The World?How long can you afford to Stop The World?
How long can you afford to Stop The World?
 
What you need to know about GC
What you need to know about GCWhat you need to know about GC
What you need to know about GC
 
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 PresentationGC Tuning in the HotSpot Java VM - a FISL 10 Presentation
GC Tuning in the HotSpot Java VM - a FISL 10 Presentation
 
Java GC
Java GCJava GC
Java GC
 
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»Вячеслав Блинов «Java Garbage Collection: A Performance Impact»
Вячеслав Блинов «Java Garbage Collection: A Performance Impact»
 
JDK Tools For Performance Diagnostics
JDK Tools For Performance DiagnosticsJDK Tools For Performance Diagnostics
JDK Tools For Performance Diagnostics
 
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享20th.陈晓鸣 百度海量日志分析架构及处理经验分享
20th.陈晓鸣 百度海量日志分析架构及处理经验分享
 
用 Python 打造你自己的 summly
用 Python 打造你自己的 summly用 Python 打造你自己的 summly
用 Python 打造你自己的 summly
 
Java gc and JVM optimization
Java gc  and JVM optimizationJava gc  and JVM optimization
Java gc and JVM optimization
 

Similar a JAVA内存泄漏及诊断

Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记yiditushe
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
11, exceptions
11, exceptions11, exceptions
11, exceptionsted-xu
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非Tony Deng
 
Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序HO-HSUN LIN
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事Ben Lue
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术hoopchina
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用FLASH开发者交流会
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识yiditushe
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层yiditushe
 
所谓闭包
所谓闭包所谓闭包
所谓闭包youzitang
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术bigqiang zou
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Swift 程序语言介绍
Swift 程序语言介绍Swift 程序语言介绍
Swift 程序语言介绍明 李
 

Similar a JAVA内存泄漏及诊断 (20)

Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
11, exceptions
11, exceptions11, exceptions
11, exceptions
 
Sun java
Sun javaSun java
Sun java
 
Javascript之昨是今非
Javascript之昨是今非Javascript之昨是今非
Javascript之昨是今非
 
Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序Net Parallel Programming .NET平行處理與執行序
Net Parallel Programming .NET平行處理與執行序
 
學好 node.js 不可不知的事
學好 node.js 不可不知的事學好 node.js 不可不知的事
學好 node.js 不可不知的事
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
详解AS3的内存管理机制,有效释放FLASH内存,减少资源占用
 
J2ee面试知识
J2ee面试知识J2ee面试知识
J2ee面试知识
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Java script closures
Java script closuresJava script closures
Java script closures
 
用Jquery实现拖拽层
用Jquery实现拖拽层用Jquery实现拖拽层
用Jquery实现拖拽层
 
所谓闭包
所谓闭包所谓闭包
所谓闭包
 
前端测试
前端测试前端测试
前端测试
 
前端测试
前端测试前端测试
前端测试
 
Java Script 引擎技术
Java Script 引擎技术Java Script 引擎技术
Java Script 引擎技术
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Swift 程序语言介绍
Swift 程序语言介绍Swift 程序语言介绍
Swift 程序语言介绍
 

JAVA内存泄漏及诊断