`

Java内存泄漏问题

阅读更多

    经历了内存泄漏的骚扰,记录一下内存泄漏时的分析手段。

 

返回Oak>>

 

1. 遇到问题及解决办法

 

   (1) 引起内存泄漏的地方
    wap page中分享和收藏相册功能中使用了如下代码:
        rose =  new RoseAppContext();
    调用分享/收藏相册时都执行一遍该语句,导致每次都会新增一个容器,将所有bean重新实例化一次,耗去大量内存。
    该语句借鉴了ShareFacade里的代码,拿来主义,没理解它都做了什么工作,从而造成了此次事故。

    (2) 以下是马帅同学定位该问题的方法
    //start
    a、根据志强邮件中的附件1048.txt,像是有对象泄漏。
       查本地的缓存:找到GlobalMemocache中有ThreahLocal的本地缓存实现,怀疑是它的问题。
       后经多次更新,实践证实,跟GlobalMemocache无关。

    b、dump出来内存镜像。发现一百多个百万级的对象数组。
       用MAT分析出这个一百多个百万级的对象数组都来自BlogPhotoAuditBiz。看源码。有单例实现。
       自己模拟这种代码实现测试,发现spring可以通过私有的无参构造方法完成构造。出现两个实例。
       然后就让志强邮件代码的开发者,希望发现同类问题。结果:无同类问题。
       开发者把数组量由百万降到十万级,问题依旧。

    c、查数据库连接:发现有800多个数据库连接。怀疑有问题。
       让志强看了下主站的,也有700百。基本排除数据库的问题。

    d、查线程锁,有大量对象锁发现。
       结果绝大多数为ICE的连接。放弃。

    e、看dump出来的数据
       看很多Map的Enty,看字符串,看调用关系,ect...浪费了很多时间,无收获。

    f、回到线上,观察内存中的实例数变化(只观察com.xiaonei.blog.biz)
       发现Service的实例数是整体的增加。像是Rose的容器中的对象都成倍增加。
       最后才想到是Rose的容器被手工new了。

    总结一下:
    第1步的时候我就犯了个错误,如果是本地缓存问题,如果最多的应该是Doing对象。
    第2步的时候已经发现BlogPhotoAuditBiz的实例不止两个,顺着这个应该会更快找到原因。
    真正的错误是MPage抄了ShareFacade中的错误用法。导致了错误的结果。

    附一下用到的几个工具和命令
    mat下载地址:www.eclipse.org/mat/downloads.php
    其它工具全是jdk自带的
    jps
      查所有java进程的VM编号,Linux下一般跟进程号pid一致。因此编号存储于/tmp下,较长时间运行的vm编号可能会被自动清理,需要自己建。
     jmap -histo:live 15604 > 15604.log
     把vm编号为15604的对象分布以列表的形式输出到一个日志文件,以便分析。我同时还用下面这条命令来确定有多少个对象的实例:
     grep com.xiaonei.blog.biz 15604.log 

     jstack 15604
     看vm中各线程的状态。包括对象锁的情况。

     jmap -heap 15604
     看内存使用情况。之前张剑曾经发现Perm区的问题,然后改了Resin的启动参数。这次是Old区的问题,Perm区还没来得及出问题。

     kill -3 15604
     不是杀进程,是在jvm.log中输出jstack和jmap -heap的内容。比较懒的用法。

     jstat -printcompilation 15604
     第1步判断的时候,以为这个命令是显示当前vm中执行的指令。看到了ThreadLocal的指令执行。可能是我理解错了,意思不详。

    我也犯了另一个错误,看到<bean>配置的时候,在init-method里指定getInstance,就误以为是指定构造。实际上这个是构造完成且属性设置完后后,顺便做的一个调用,只是可以用来做一些初始化操作。
//end

=============================赤色分界线====================================

 

1. 用jmap查看内存镜,分析各个对象的实例

 

    使用jmap命令:(需要配置JAVA_HOME和PATH变量)

    jmap -histo:live processid > /home/zzq/jmap_1150

 

2. 使用Eclipse Memory Analyzer

 

    jmap -dump:live,format=b,file=heap.bin processid

 

3. 使用Jprofiler

 

    下载地址:http://www.ej-technologies.com/download/jprofiler/trial

    (1) 在本地装好Jprofiler并配置

 

      工具栏Start Center-->New Session选项卡-->New Remote Integration

      Local or remote:选 on a remote computer,然后选linux版本

      Profiled JVM:根据服务器上的jdk填写

      Startup mode:选第一个 Wait for a connection from the JProfiler GUI

      Remote address:填写服务器的ip地址

      Remote installation directory:/opt/jprofiler6

      Choose profiling port: 默认8849

      Perform modifications:复制出来,下面用-agentpath:/opt/jap/bin/linux-x86/libjprofilerti.so=port=8849

 

    (2) 在服务器端自装Jprofiler

 

      在服务器端(Linux)装jprofiler_linux_6_2.rpm::   rpm -ivh jprofiler_linux_6_2.rpm

      查找安装后所在目录: rpm -ql jprofiler-6.2-1.i386

      配置环境变量:vim /etc/profile

        添加以下参数:

        JPROFILE_HOME=/opt/jprofiler6
        LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JPROFILE_HOME/bin/linux-x86
        export JPROFILE_HOME
        export LD_LIBRARY_PATH

      启动resin服务器:/opt/resin-page/bin/httpd.sh -agentpath:/opt/jprofiler6/bin/linux-x64/libjprofilerti.so=port=8849

 

返回 Oak>>

分享到:
评论

相关推荐

    java内存泄漏问题追踪

    Java内存泄漏问题追踪 在Java编程中,内存泄漏是一个严重的问题,它会导致程序性能下降,甚至可能导致应用程序崩溃。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,随着时间推移,系统可用内存逐渐...

    关于JAVA内存泄漏问题注意事项

    Java内存泄漏问题是一个重要的主题,尤其对于大型的J2EE应用程序而言,理解并避免内存泄漏至关重要。虽然Java的垃圾收集机制能自动管理内存,但并不意味着程序员可以完全忽视内存管理。以下是一些关于Java内存泄漏的...

    JAVA内存泄漏问题处理方法经验总结

    这篇博客“JAVA内存泄漏问题处理方法经验总结”分享了作者在处理此类问题时的一些实用技巧和经验,结合源码分析和工具使用,对于Java开发者来说是非常有价值的。 首先,了解内存泄漏的基本概念是至关重要的。内存...

    关于java内存泄露问题解决

    ### 关于Java内存泄露问题解决 #### 引言:Java内存管理的核心——垃圾回收机制(GC) Java作为当今产业界和学术界最炙手可热的编程语言之一,以其独特的安全性和可移植性赢得了广泛的应用,尤其是在服务器端编程...

    如何解决Java内存泄漏

    Java内存泄漏是软件开发中一个常见的问题,它不仅会影响应用程序的性能,还可能导致系统崩溃。通过深入了解Java的内存管理机制,并借助于专业的工具如OptimizeIt,可以有效地检测和解决内存泄漏问题。此外,开发者还...

    java内存泄漏解决

    本文将详细介绍如何解决Java内存泄漏问题,帮助开发者更好地理解和应对这一挑战。 #### 二、Java内存模型与内存区域 Java虚拟机(JVM)管理着多种不同类型的内存区域,包括堆内存(Heap Memory)、方法区(Method Area)...

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

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

    Java内存泄露_JVM监控工具介绍

    为了检测和解决Java内存泄露问题,Java提供了多种工具和命令来帮助开发者快速地定位和解决问题。本文将介绍Java内存泄露的相关知识点和JVM监控工具的使用方法。 一、jstack命令 jstack命令是一个强大的工具,用于...

    java内存泄漏分析工具

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

    Java内存泄漏问题相关总结

    【Java内存泄漏问题相关总结】 在Java编程中,内存泄漏是一个严重的问题,它指的是程序中已分配的内存没有被正确地释放,导致这部分内存无法被垃圾收集器(GC)回收,长时间积累会消耗大量系统资源,影响应用性能。...

    如何解决Java内存泄漏.pdf

    Java内存泄漏是一个开发者在开发和维护Java应用程序时必须面对的问题。内存泄漏会导致程序占用越来越多的内存资源,从而影响性能,甚至导致程序崩溃。本文将深入讨论Java内存泄漏的解决方法,提供一些工具和技巧,...

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

    本文将深入探讨Java内存分析和内存泄露问题。 首先,我们需要了解Java内存模型的基础。Java内存主要分为三个区域:堆(Heap)、栈(Stack)和方法区(Method Area)。堆用于存储对象实例,栈用于存储方法调用及局部...

    JAVA内存泄漏分析工具

    "JAVA内存泄漏分析工具"正是一款用于解决此类问题的专业工具,它能帮助开发者定位并修复内存相关的问题,如内存泄漏和内存溢出。 内存泄漏是程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄漏可能看似...

    内存泄漏问题\防范JAVA内存泄漏解决方案

    在Java编程中,内存泄漏是一个严重的问题,尤其对于长时间运行的应用程序,它可能...通过细心的代码审查、合理的对象管理和利用工具进行监控,我们可以有效地避免和解决Java内存泄漏问题,从而确保应用的稳定性和性能。

    Java内存泄漏问题处理方法经验总结

    Java内存泄漏问题处理方法经验总结 Java内存泄漏问题处理方法经验总结是Java开发中非常重要的一个方面,今天我们将分享关于Java内存泄漏问题处理方法经验总结的知识点。 首先,Java内存泄漏的问题描述是系统在...

    java内存泄露总结

    Java内存泄露问题是软件开发过程中常见的难题之一。通过对内存管理机制的理解及上述几种常见内存泄露场景的认识,开发者可以更好地预防和解决这类问题。为了进一步提高代码的质量,建议在开发过程中结合单元测试和...

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

    通过MAT插件,你可以定位到那些持有大量内存但本应被释放的对象,从而修复内存泄露问题。同时,MAT还会提供一些优化建议,帮助你改进代码,减少不必要的内存消耗。 总之,"java内存泄露分析工具 eclipse3.5插件"是...

    详解Java内存泄露的示例代码

    Java内存泄露的示例代码的知识点总结 Java内存泄露是指Java应用程序中由于某些原因导致的内存不能被正确释放,导致JVM ...通过正确释放资源,避免使用ThreadLocal,正确使用ClassLoader,可以避免Java内存泄露问题。

Global site tag (gtag.js) - Google Analytics