`
xvm03
  • 浏览: 144325 次
  • 来自: ...
社区版块
存档分类
最新评论

java内存泄漏笔记--ZT

阅读更多

利用jdk6查内存泄漏(见编写对GC友好,又不泄漏的代码)
(1)jmap -dump:file=heap_file_name pid 会产生一个heap_file_name文件
(2)jhat heap_file_name,然后打开浏览器http://localhost:7000/ 浏览。
   可看到里面显示了运行的所有的类和实例及大小。平台(例如tomcat)的不会包括在里面。
(3)如果觉得不够,还可以把heap_file_name文件加一个bin的后缀,然后让Eclipse MAT来分析。看这里。
另外
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt  pid 如:查看2788的MaxPerm大小可以用  jinfo -flag MaxPermSize 2788。
jstat 也很有用,说明见这里


3,
SUN JDK所支持的典型选项以及说明:http: //java.sun.com/javase/technologies/hotspot/vmoptions.jsp 上面有很多选项
-XX:-HeapDumpOnOutOfMemoryError 从jdk1.4.2 update 12 和java 5 update 7开始支持这个选项。

4,
关于jmap
从JDK 5开始,SUN JDK开始提供JMap的工具。但是仅仅是实验性质的,而且只有在solaris平台上有。
后来Jmap被反向移植到jdk 1.4.2_09。因为是实验性质,所以jmap可能会出现dump失败的情况。
但是自从JDK 6之后,jmap的稳定性和可用性都没问题了。请注意各个版本的jvm都要用自己版本的jmap,
而jhat可以用于分析各个版本的jmap dump出来的文件。至于jhat用于分析1g以上的dump文件,
我们有过多次在笔记本上的成功经历,它对内存的要求可能并没有那么高。
http://space.itpub.net/27378/viewspace-521225

5,J2SE6中使用jhat来分析内存堆
http://hi.baidu.com/tister/blog/item/e7374482f4341ca70cf4d2e8.html

6,Java内存溢出(OutOfMemory),内存分析相关工具
http://uglytroll.ycool.com/post.3046111.html

7,JDK中的好工具 jmap、jhat
http://wangzaixiang.blogspot.com/2008/10/jdk-jmapjhat.html
http://hi.baidu.com/zeorliu/blog/item/4f38989413601719d21b70d5.html

8,SAP贡献给eclipse基金会的MemoryAnalyzer,原来叫Java Memory Analysis
能分析几G的Memory Dump而不会内存溢出?
http://www.eclipse.org/mat/
可惜还是只支持jdk1.4.2 update 12 和java 5 update 7以上

9,在一个方法里面的变量是不会引起内存泄露的。
内存泄露都是发生在类变量和实例变量(且此实例被缓存、如单例模式)里。
我建议你从HashMap、HashMap$Entry 入手查查。
我也研究过一阵子的内存泄露问题,最终解决了。
http://www.iteye.com/topic/233080

10,你遇到的是最理想的情况,但有时候,这种方法不能找到原因,只找到造成崩溃的点.就好比,
一个HTTP 请求,没有设置超时(对不起,默认是不超时,不知道为什么SUN要这样设定),
然后这条线程就卡在这里了,然后,这条线程里的一个堆栈被另一条线程放入内容,
本来这些内容就是要这条闲线程去处理的,但是现在,这条线程卡住了,但是用你说的这种方法,
绝对找不到造成内存泄露的原因是因为http不超时,一直卡在那里.

我还有一个笨办法做精细的内存分配比较:就是定期用pmap命令dump出来JVM进程的内存映射表,然后diff。
http://www.iteye.com/topic/256701

11,http://calvin.iteye.com/blog/91903
 java 不是有垃圾收集器了吗?怎么还泄漏啊,唬我啊??
   嗯,此泄漏非比泄漏。C/C++的泄漏,是对象已不可到达,而内存又没有回收,真正的内存黑洞。
   而Java的泄漏,则是因为各种原因,对象对应用已经无用,但一直被持有,一直可到达。
   总结原因无外乎几方面:

   1). 被生命周期极长的集合类不当持有,号称是Java内存泄漏的首因。
      这些集合类的生命周期通常极长,而且是一个辅助管理性质的对象,在一个业务事务运行完后,如果没有将某个业务对象主动的从中清除的话,这个集合就会吃越来越多内存,可以用WeakReference,如WeakHashMap,使得它持有的对象不增加对象的引用数。
   2). Scope定义不对,这个很简单了,方法的局部变量定义成类的变量,类的静态变量等。
   3). 异常时没有加finally{}来释放某些资源,JDBC时代也是很普遍的事情。
   4). 另外一些我了解不深的原因,如:Swing里的Listener没有显式remove;内部类持有外部对象的隐式引用;Finalizers造成关联对象没有被及时清空等。

搭车
我的SQL调优公式T=S/V
http://space.itpub.net/27378/viewspace-157789

MetaWidget及SOA
http://wangzaixiang.blogspot.com/2008/10/metawidget.html

分享到:
评论

相关推荐

    java检测内存泄露工具--jprofiler5

    java检测内存泄露工具--jprofiler5 里面含破解注册码,按照使用说明即可使用!

    如何解决Java内存泄漏

    ### 如何解决Java内存泄漏 #### 1. 背景 Java凭借其垃圾回收机制大大简化了内存管理,使得开发者无需手动管理内存的释放,从而提升了开发效率。然而,这种自动化管理也可能成为一把双刃剑,特别是当开发人员忽视...

    JAVA学习经典笔记-----2

    而C++需要程序员手动管理内存,容易出现内存泄漏等问题。 2. **平台独立性:** Java具有良好的跨平台特性,“一次编写,到处运行”,而C++程序依赖于特定的操作系统和硬件环境。 3. **异常处理:** Java有专门的异常...

    java内存分析-内存泄露问题.rar

    内存泄露是Java程序员需要密切关注的问题,因为它们可能导致系统性能下降,甚至可能导致系统崩溃。本文将深入探讨Java内存分析和内存泄露问题。 首先,我们需要了解Java内存模型的基础。Java内存主要分为三个区域:...

    java内存泄露、溢出检查方法和工具

    Java内存管理是开发Java应用程序时的关键环节,内存泄露和溢出问题可能导致系统性能下降,甚至导致服务崩溃。本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 ...

    java内存泄漏问题追踪

    4. "java内存泄露专题研究和应用_石麟.docx"可能提供了更深入的研究和实际案例,包括如何识别特定类型的内存泄漏,以及针对不同场景下的解决方案。而"ha450.jar"可能是一个示例应用或者工具,用于演示内存泄漏问题...

    java内存管理白皮书-英文版

    ### Java内存管理概述 在Java 2平台标准版(J2SE)中,自动内存管理是其核心优势之一。这使得开发人员免于处理复杂的显式内存管理问题。本文档旨在提供一个关于Java HotSpot虚拟机(JVM)内存管理的全面概览,特别...

    java内存泄漏分析工具

    Java内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。为了有效地诊断和解决这类问题,开发者需要借助特定的分析工具。本篇将详细探讨Java内存泄漏及其相关的分析工具。 内存泄漏是指...

    java笔记--

    例如,Java使用垃圾回收机制自动管理内存,避免了C++中的内存泄漏问题。 - **类与对象**:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,对象则是类的实例。 - **封装**:通过访问修饰符控制数据的...

    java内存泄漏解决

    ### Java内存泄漏解决方案详解 #### 一、Java内存泄漏概述 在Java开发过程中,经常会遇到内存泄漏的问题,尤其是在长时间运行的应用程序中更为常见。本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地...

    java 内存泄漏

    内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,一次又一次地泄露,最终可能耗尽所有可用内存。在Java中,内存泄漏主要发生在Java堆内存中,其主要原因有: - **对象引用不再使用**:当一个对象不再被...

    ibm-java-堆内存分析工具-heapanalyzer

    IBM Java堆内存分析工具——HeapAnalyzer,是一款专为IBM J9 VM设计的强大内存分析工具,它可以帮助开发者深入理解Java应用程序的内存使用情况,检测并解决内存泄漏问题,从而提升应用性能。本文将详细介绍Heap...

    java笔记-面试笔试-2010

    【Java笔记-面试笔试-2010】涵盖了J2SE的基础知识,主要涉及内存管理、垃圾回收(GC)、输入输出(IO)、集合框架(Collection)等Java面试常见主题。以下是对这些知识点的详细说明: 1. **内存管理**: - Java...

    JAVA内存分析 - V1.0.0.zip

    "mat" 指的是Eclipse Memory Analyzer Tool,这是一款强大的Java内存分析工具,特别适合于分析Java应用的内存泄漏和过大对象的问题。MAT可以通过heap dump文件对JVM的内存状态进行深度分析,提供详细的内存占用报告...

    Java堆栈内存分析笔记

    Java堆栈内存分析是Java编程中的重要概念,它关乎程序的性能优化和内存泄漏的预防。堆和栈是Java内存管理的两个主要区域,它们各自承担着不同的职责。本笔记将深入探讨这两个区域的工作原理以及如何进行有效的分析。...

    java内存泄露分析工具 eclipse3.5插件

    Java内存泄露是一个严重的问题,它可能导致程序性能下降,甚至导致应用程序崩溃。Eclipse Memory Analyzer(MAT)是一款强大的Java内存分析工具,特别适用于检测和解决内存泄露。标题提到的"java内存泄露分析工具 ...

    JavaMelody javamelody-core-1.52.0.jar jrobin-1.5.9.jar

    2. **内存监控**:实时显示堆内存和非堆内存的使用情况,及时发现内存泄漏。 3. **数据库监控**:追踪SQL查询,显示执行时间,有助于优化数据库操作。 4. **缓存监控**:如果应用使用了缓存(如Ehcache或Hazelcast)...

    Java内存泄露及内存无法回收解决方案

    本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并提供相应的解决方案。 首先,我们要了解Java内存模型。Java虚拟机(JVM)中有三个主要的内存区域:堆内存(Heap)、栈内存(Stack)和方法区(Method...

Global site tag (gtag.js) - Google Analytics