`

<转>Java 多线程或内存泄漏缺陷排查的一些经验

    博客分类:
  • java
 
阅读更多
地址:http://www.blogjava.net/zhugf000/archive/2007/05/16/22890.html


JVM Thread DUMP 基本功
Windows 下用Ctrl-Break,Unix 下用 kill -3 <pid> 的命令让JVM输出 thread dump。
每隔几秒 thread dump 一次,多做几次,分析比较。

Thread Dump分析的一些经验
1 找出这几次Thread dump 文件中,有哪些 Java Thread 处于长时间等待状态,很有可能就是问题之所在。
2 如果Java 线程等在某些不可能出错的地方,如 java.lang.XXX/java.util.XXX对象的某个方法,则很有可能是因为出现了 OutOfMemoryError 异常,原因不外乎是JVM 堆内存过小或出现内存泄漏。
3 对于死锁,最直接的表现就是至少两个线程长时间等待相互持有的对象(每个线程所持有的对象和它当前等待的对象都可以从 dump 中看到)。
4 对于死循环,要辅助CPU占用率确定;如果发现CPU至少一颗使用率为100%,并且有线程长时间位于用户代码处,则很有可能是死循环引起。


多线程缺陷排查
对于Java死锁问题很少出现,多线程访问变量时冲突很常见。
一般出在多线程共享同一对象实例如全局Map,Servlet,Interceptor,或如多线程同时访问某个静态方法,而此静态方法不巧又访问另一个静态变量。
这类问题自测发现不了,在并发压力测试时才能发现。如果代码的入口检查做得好,多半会抛出一些莫名其妙的异常;要不然就会出现正常运行但数据库记录不对的情况。
对这种问题,并无多好的办法解决,主要还是靠看异常堆栈和静态代码分析来解决。


内存泄漏排查
一般用商用辅助工具排查,但有可能出现在JVM heap dump 模式下,运行极度缓慢的情况。
笨笨曾经用过一个非常简单的工具,效果不错,它可以做到在不影响jvm 执行速度的情况下,做heap dump,然后对dump出的文件进行排序,检查即可。
分享到:
评论

相关推荐

    java应用程序中使用线程

    锁定排序&lt;br&gt;3.6 线程优先级&lt;br&gt;3.7 监控程序线程&lt;br&gt;3.8 在应用程序中加入线程&lt;br&gt;3.9 线程控制&lt;br&gt;3.9.1 线程启动&lt;br&gt;3.9.2 线程休眠&lt;br&gt;3.9.3 线程挂起&lt;br&gt;3.9.4 线程恢复&lt;br&gt;3.9.5 线程停止&lt;br&gt;3.9.6...

    Vchome资料库--多线程技术篇(CHM)

    10&lt;br/&gt;&lt;br/&gt;关于多线程的一些细节... 23&lt;br/&gt;&lt;br/&gt;用VC++5.0 实 现 多 线 程 的 调 度 和 处 理... 25&lt;br/&gt;&lt;br/&gt;一 多 任 务, 多 进 程 和 多 线 程... 25&lt;br/&gt;&lt;br/&gt;二 基 于MFC 的 多 线 程 编 程... 26&lt;br/&gt;&lt;br...

    北大Java语言程序设计(ppt课件)

    &lt;br&gt;第七讲 多线程 &lt;br&gt; &lt;br&gt;第八讲 图形用户界面与事件处理&lt;br&gt; &lt;br&gt;第九讲 Java Applet&lt;br&gt; &lt;br&gt;第十讲 网络通信 &lt;br&gt; &lt;br&gt;第十一讲 J2EE &lt;br&gt;JDBC&lt;br&gt;J2EE简介&lt;br&gt;Servlet&lt;br&gt;JSP&lt;br&gt;Java Beans&lt;br&gt;EJB&lt;br&gt;Web ...

    <好书>java解惑(java puzzlers),过来挑战吧

    这些谜题涵盖了从基本语法到高级特性的各种主题,包括但不限于类型转换、对象引用、内存管理、多线程、异常处理、集合框架以及Java的API使用等。 1. 类型转换:Java是一种静态类型语言,但类型转换时可能出现问题,...

    Java2+类库参考手册-pdf

    译 者 序&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; Java是Sun公司推出的新型面向对象程序设计语言。它将面向对象、平台无关性、稳固性、安全性、多线程等诸多特性集于一身,为用户...&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; 译 者&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt; 2000年5月&lt;br&gt;&lt;br&gt;

    java多线程处理数据库数据

    在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...

    opencv3和opencv4多线程内存泄漏问题

    opencv3和opencv4多线程内存泄漏问题:以cv::resize函数测试结果为例。 使用中可修复或者可避免内存泄漏:1)使用opencv2的版本;2)在代码中设置修复该问题.

    JAVA技巧(Java多线程运行时,减少内存占用量).pdf

    本文介绍了在Java多线程环境下减少内存占用量的一些关键策略,包括线程生命周期管理、对象生命周期设计、同步机制选择、线程池的使用和线程数量控制。同时,代码的异常处理和JVM参数调优也是提升多线程应用性能的...

    SUN JAVA 培训专用教材

    &lt;br&gt;课程概述&lt;br&gt;本课程主要包括以下内容:&lt;br&gt;- Java编程语言句法&lt;br&gt;- 应用于Java编程语言的面向对象的概念&lt;br&gt;- 图形用户界面(GUI)编程&lt;br&gt;- 创建Applet&lt;br&gt;- 多线程&lt;br&gt;- 网络&lt;br&gt;本课程首先讨论了Java运行...

    openssl编程

    249&lt;br&gt;31.4 数据结构 250&lt;br&gt;31.5 加密套件 251&lt;br&gt;31.6 密钥信息 252&lt;br&gt;31.7 SESSION 252&lt;br&gt;31.8 多线程支持 253&lt;br&gt;31.9 编程示例 253&lt;br&gt;31.10 函数 264&lt;br&gt;第三十二章 Openssl命令 267&lt;br&gt;32.1概述 267&lt;br&gt;...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    通过`jstat -gc &lt;pid&gt; &lt;interval&gt; &lt;count&gt;`,我们可以定期获取JVM的垃圾回收状况,这对于优化内存配置和识别潜在的内存泄漏问题非常有帮助。 总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够...

    javabook

    &lt;br&gt;&lt;br&gt;&lt;br&gt;各模块概述&lt;br&gt;- 模块1──起步&lt;br&gt;- 模块2──标识符、关键字和类型&lt;br&gt;- 模块3──表达式和流程控制&lt;br&gt;- 模块4──数组&lt;br&gt;- 模块5──对象和类&lt;br&gt;- 模块6──高级语言特性&lt;br&gt;- 模块7──异常&lt;br&gt;-...

    java辅导

    Java 程序编码规范.doc&lt;br&gt;Java的文件与磁盘操作.doc&lt;br&gt;Java多线程编程详解.doc&lt;br&gt;Java远程方法调用.doc&lt;br&gt;Java中的时间操作.doc&lt;br&gt;深入理解abstract class和interface.doc&lt;br&gt;……

    C#源码大集合 01(共3卷)

    chap09-多线程&lt;br&gt;├─D00-多线程&lt;br&gt;├─Windows多线程编程技术与实例&lt;br&gt;...&lt;br&gt;...&lt;br&gt;├─多线程,多接收模式串口类&lt;br&gt;├─多线程文件传输&lt;br&gt;├─多线程的日志记录DLL&lt;br&gt;├─多线程端口扫描程序&lt;br&gt;├─多...

    java使用JMAP定位代码内存泄漏在哪

    4. **堆内存统计**:`jmap -finalizerinfo &lt;pid&gt;`可以查看等待Finalizer线程处理的对象,这有时是内存泄漏的一个迹象。 当获得heap dump文件后,我们通常会使用Eclipse Memory Analysis Tools (MAT)这样的专业工具...

    C#源码大集合 03(共3卷)

    chap09-多线程&lt;br&gt;├─D00-多线程&lt;br&gt;├─Windows多线程编程技术与实例&lt;br&gt;...&lt;br&gt;...&lt;br&gt;├─多线程,多接收模式串口类&lt;br&gt;├─多线程文件传输&lt;br&gt;├─多线程的日志记录DLL&lt;br&gt;├─多线程端口扫描程序&lt;br&gt;├─多...

    C#多线程List的非线程安全性

    3. 避免在多线程环境中直接修改List&lt;T&gt;:尽量减少在多线程环境中的修改操作,改为在单线程或使用线程同步后再进行修改。 4. 使用CopyTo()方法:如果只需要读取List&lt;T&gt;,可以先将List&lt;T&gt;复制到一个新的数组,然后在...

    Java多线程实现异步调用实例

    在Java编程中,多线程和异步调用是提高应用程序性能和响应能力的重要手段。在本实例中,我们将深入探讨如何使用Java实现多线程以实现异步调用,并理解其背后的机制。 首先,多线程允许一个程序同时执行多个任务。在...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

Global site tag (gtag.js) - Google Analytics