SlideShare a Scribd company logo
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

More Related Content

PPTX
5, initialization & cleanup
PDF
Java Thread
PDF
Jni攻略之八――操作对象的构造方法
PDF
由一个简单的程序谈起――之五(精华)
DOC
Java华为面试题
PDF
深入淺出 Web 容器 - Tomcat 原始碼分析
PPTX
Java多线程设计模式
PPTX
180518 ntut js and node
5, initialization & cleanup
Java Thread
Jni攻略之八――操作对象的构造方法
由一个简单的程序谈起――之五(精华)
Java华为面试题
深入淺出 Web 容器 - Tomcat 原始碼分析
Java多线程设计模式
180518 ntut js and node

What's hot (20)

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

Viewers also liked (20)

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

Similar to JAVA内存泄漏及诊断 (10)

PPT
Java中的内存泄漏与防止办法
PPT
JVM内容管理和垃圾回收
PPT
Jvm内存管理基础
PPT
Jvm那些事
PDF
GC算法和IE中JS内存泄露
DOC
大公司的Java面试题集
PPT
Java垃圾收集原理
PPT
Java垃圾收集原理
DOC
Java面试知识
DOC
Java面试32题
Java中的内存泄漏与防止办法
JVM内容管理和垃圾回收
Jvm内存管理基础
Jvm那些事
GC算法和IE中JS内存泄露
大公司的Java面试题集
Java垃圾收集原理
Java垃圾收集原理
Java面试知识
Java面试32题

JAVA内存泄漏及诊断