工程实践-Java内存泄漏的定位与分析

内存泄漏及解决方案 首先,需要了解浏览器自身的内存回收机制。每个浏览器会有自己的一套回收机制,当分配出去的内存不使用的时候便会回收;内存泄露的根本原因就是你的代码中分配了一些‘顽固的’内存,浏览器无法进行回收,如果这些’顽固的’内存还在一直不停地分配就会导致后面所用内存不足,造成泄露。 阅读详情

1、为什么会发生内存泄漏

java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。

编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相应的大小限制或清除机制。容易导致内存溢出。
当服务器应用占用了过多内存的时候,如何快速定位问题呢?现在,Eclipse MAT的出现使这个问题变得非常简单。EclipseMAT是著名的SAP公司贡献的一个工具,可以在Eclipse网站下载到它,完全免费的。
    
要定位问题,首先你需要获取服务器jvm某刻内存快照。jdk自带的jmap可以获取内存某一时刻的快照,导出为dmp文件后,就可以用Eclipse MAT来分析了,找出是那个对象使用内存过多。

2、内存泄漏的现象:

常常地,程序内存泄漏的最初迹象发生在出错之后,在你的程序中得到一个OutOfMemoryError。这种典型的情况发生在产品环境中,而在那里,你希望内存泄漏尽可能的少,调试的可能性也达到最小。也许你的测试环境和产品的系统环境不尽相同,导致泄露的只会在产品中暴露。这种情况下,你需要一个低负荷的工具来监听和寻找内存泄漏。同时,你还需要把这个工具同你的系统联系起来,而不需要重新启动他或者机械化你的代码。也许更重要的是,当你做分析的时候,你需要能够同工具分离而使得系统不会受到干扰。
  一个OutOfMemoryError常常是内存泄漏的一个标志,有可能应用程序的确用了太多的内存;这个时候,你既不能增加JVM的堆的数量,也不能改变你的程序而使得他减少内存使用。但是,在大多数情况下,一个OutOfMemoryError是内存泄漏的标志。一个解决办法就是继续监听GC的活动,看看随时间的流逝,内存使用量是否会增加,如果有,程序中一定存在内存泄漏。

3、发现内存泄漏

   1. jstat -gc pid

           可以显示gc的信息,查看gc的次数,及时间。

           其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。

     2.jstat -gccapacity pid

           可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,

           如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,

           PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。

           其他的可以根据这个类推, OC是old内纯的占用量。

     3.jstat -gcutil pid

            统计gc信息统计。

     4.jstat -gcnew pid

            年轻代对象的信息。

     5.jstat -gcnewcapacity pid

           年轻代对象的信息及其占用量。

     6.jstat -gcold pid

            old代对象的信息。

     7.stat -gcoldcapacity pid

           old代对象的信息及其占用量。

     8.jstat -gcpermcapacity pid

           perm对象的信息及其占用量。

     9.jstat -class pid

           显示加载class的数量,及所占空间等信息。
     10.jstat -compiler pid

           显示VM实时编译的数量等信息。

     11.stat -printcompilation pid

          当前VM执行的信息。

        一些术语的中文解释:

         S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
         S1C
:年轻代中第二个survivor(幸存区)的容量 (字节)
         S0U
:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
         S1U
:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
          EC
:年轻代中Eden(伊甸园)的容量 (字节)
          EU
:年轻代中Eden(伊甸园)目前已使用空间 (字节)
          OC
:Old代的容量 (字节)
          OU
:Old代目前已使用空间 (字节)
          PC
:Perm(持久代)的容量 (字节)
          PU
:Perm(持久代)目前已使用空间 (字节)
         YGC
:从应用程序启动到采样时年轻代中gc次数
        YGCT
:从应用程序启动到采样时年轻代中gc所用时间(s)
         FGC
:从应用程序启动到采样时old代(全gc)gc次数
        FGCT
:从应用程序启动到采样时old代(全gc)gc所用时间(s)
         GCT
:从应用程序启动到采样时gc用的总时间(s)

       NGCMN:年轻代(young)中初始化(最小)的大小 (字节)

       NGCMX:年轻代(young)的最大容量 (字节)

         NGC:年轻代(young)中当前的容量 (字节)

       OGCMN:old代中初始化(最小)的大小 (字节) 

       OGCMX:old代的最大容量 (字节)

        OGC:old代当前新生成的容量 (字节)

       PGCMN:perm代中初始化(最小)的大小 (字节) 

       PGCMX:perm代的最大容量 (字节)   

         PGC:perm代当前新生成的容量 (字节)

         S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比

          S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比

         E:年轻代中Eden(伊甸园)已使用的占当前容量百分比

         O:old代已使用的占当前容量百分比

         P:perm代已使用的占当前容量百分比

       S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)

       S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)

        ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)

         DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)

          TT:持有次数限制

         MTT :最大持有次数限制

 

如果定位内存泄漏问题我一般使用如下命令:

Jstat  -gcutil15469 2500 70


[root@ssss logs]# jstat -gcutil 15469  1000 300

S0 S1 E O P YGC YGCT FGC FGCT GCT

0.00 1.46 26.54 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 46.54 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 47.04 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 65.19 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 67.54 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 87.54 4.61 30.14 35 0.872 0 0.000 0.872

0.00 1.46 88.03 4.61 30.14 35 0.872 0 0.000 0.872

1.48 0.00 5.56 4.62 30.14 36 0.874 0 0.000 0.874

1000 代表多久间隔显示一次,

100 代表显示一次。

S0 — Heap上的 Survivor space 0 区已使用空间的百分比

S1 — Heap上的 Survivor space 1 区已使用空间的百分比

E — Heap上的 Eden space 区已使用空间的百分比

O — Heap上的 Old space 区已使用空间的百分比

P — Perm space 区已使用空间的百分比

YGC — 从应用程序启动到采样时发生 Young GC 的次数

YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)

FGC — 从应用程序启动到采样时发生 Full GC 的次数

FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)

GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)


如果有大量的FGC就要查询是否有内存泄漏的问题了,图中的FGC数量就比较大,并且执行时间较长,这样就会导致系统的响应时间较长,如果对jvm的内存设置较大,那么执行一次FGC的时间可能会更长。

如果为了更好的证明FGC对服务器性能的影响,我们可以使用java visualVM来查看一下:


从上图可以发现执行FGC的情况,下午3:10分之前是没有FGC的,之后出现大量的FGC。

上图是jvm堆内存的使用情况,下午3:10分之前的内存回收还是比较合理,但是之后大量内存无法回收,最后导致内存越来越少,导致大量的full gc。

下面我们在看看大量full GC对服务器性能的影响,下面是我用loadrunner对我们项目进行压力测试相应时间的截图:


从图中可以发现有,在进行full GC后系统的相应时间有了明显的增加,点击率和吞吐量也有了明显的下降。所以java内存泄漏对系统性能的影响是不可忽视的。

3、定位内存泄漏

当然通过上面几种方法我们可以发现java的内存泄漏问题,但是作为一名合格的高级工程师,肯定不甘心就把这样的结论交给开发,当然这也的结论交给开发,开发也很难定位问题,为了更好的提供自己在公司的地位,我们必须给开发工程师提供更深入的测试结论,下面就来认识一下MemoryAnalyzer.exe。java内存泄漏检查工具利器。

首先我们必须对jvm的堆内存进行dump,只有拿到这个文件我们才能分析出jvm堆内存中到底存了些什么内容,到底在做什么?

MemoryAnalyzer的用户我在这里就不一一说明了,我的博客里也有说明,下面就展示我测试的成功图:


其中深蓝色的部分就为内存泄漏的部分,java的堆内存一共只有481.5M而内存泄漏的部分独自占有了336.2M所以本次的内存泄漏很明显,那么我就来看看那个方法导致的内存泄漏:


从上图我们可以发现红线圈着的方法占用了堆内存的67.75%,如果能把这个测试结果交给开发,开发是不是应该很好定位呢。所以作为一名高级测试工程师,我们需要学习的东西太多。

虽然不确定一定是内存泄漏,但是可以准确的告诉开发问题出现的原因,有一定的说服力。

本人刚刚完成了云存储架构师的培训学习(包括了linux的内核了解、 shell的高级编程、linux安全的学习重点iptables和tcp/ip等各种协议的抓包分析、linux的集群、性能调优等接下来还有dba的课程等待着我挑战)。

 

 


友情推荐:ABC技术研习社

为技术人打造的专属A(AI),B(Big Data),C(Cloud)技术公众号和技术交流社群。



MAT工具定位分析Java堆内存泄漏问题方法 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以安装到Eclipse使用,另一种是独立版,可以直接解压使用。 阅读详情

相关推荐

Android内存泄漏定位与解决

百度MTC是业界领先的移动应用测试服务平台,为广大开发者在移动应用测试中面临的成本、技术和效率问题提供解决方案。同时分享行业领先的百度技术,作者来自百度员工和业界领袖等。 问题现象 反复点击被测试的Android App的toolbar界面,然后返回再点击。在此重复过程中,发现到一定次数时,页面打开速度变慢,有时达到5s,十分影响用户体验。该问题涉及app所采用的webview框架

baidu_mtc的博客 2944

java内存泄漏的定位与分析

1、为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从H...

系统运维 1405

Android Studio 分析内存泄漏

内存分析入门

一叶知秋的专栏 7057

「Java」 - 内存泄漏问题定位方案(全)

java内存泄露全套定位方案

ya_shy的博客 8222

MAT内存分析工具实战指南:深入解析Java内存泄漏

本文还有配套的精品资源,点击获取 简介:MAT(Memory Analyzer Tool)是一款由Oracle提供的Java内存泄漏分析工具,适用于Windows平台。它通过直观的界面和多种分析功能,帮助开发者识别和解决Java应用中的内存泄漏问题。MAT提供对象概述、dominator tree、内存泄漏嫌疑报告、对象比较、碎片分析和自定义分析等核心功能,使内存泄漏排查更...

weixin_35705784的博客 3544

《商用密码应用与安全性评估》第四章密码应用安全性评估实施要点4.1密码应用方案设计

密码应用方案设计

qq_40442137的博客 1474

性能分析-内存泄漏

内存泄漏

雷雨天的雷胖子 1726

从NVLINK到EthLink:GPU互联技术演进全解析(含最新行业趋势)

本文深入解析了从NVLINK到EthLink的GPU互联技术演进,重点剖析了Scale-up与Scale-out两种核心范式。文章详细对比了NVLINK、UALINK及革命性的EthLink技术,后者创新性地将以太网改造为支持Load/Store与RDMA双语义的高性能互联网络,旨在打破封闭生态,实现高性能与开放性的统一。最后,文章提供了技术选型指南并展望了未来以以太网为主导、语义融合的行业趋势。

weixin_29204749的博客 179

Java中关于内存泄漏分析和解决方案,都在这里了!

内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC(

2301_78586758的博客 2105

电子元器件-逻辑器件篇:逻辑电平、CMOS逻辑、手册解读、逻辑电平转换,应用注意事项

常用的逻辑电平TTL、CMOS、LVTTL、LVCOMS、CML、ECL、PECL、LVPECL、LVDS、RS232电平RS422电平,RS485电平等。TTL和CMOS的逻辑电平按典型电压可分为四类:5V系列、3.3V系列,2.5V系列和1.8V系列。5V TTL和5V CMOS逻辑电平是通用的逻辑电平。3.3V及以下的逻辑电平被称为低电压逻辑电平,常用的为LVTTL电平低电压的逻辑电平还有2.5V和1.8V两种。

qq_60226558的博客 864

RK3588与FocalTech触摸屏代码适配全解析:从原理到实战

摘要:本文详细介绍了瑞芯微RK3588处理器与FocalTech触摸屏的适配过程,包括硬件特性、驱动加载、设备树配置和常见问题解决方案。RK3588作为8nm工艺的高性能处理器,具备强大的计算能力和丰富的接口资源;FocalTech触摸屏则采用电容式技术,支持I2C/SPI接口。适配关键步骤包括驱动程序加载、硬件连接检查、设备树配置和内核版本兼容性处理,并提供了代码示例和问题排查方法。随着嵌入式设备智能化发展,该适配技术将持续优化,为智能交互提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 273

内存泄漏的追踪及分析定位

内存泄漏指的是程序中不再需要的内存未能被释放,导致内存使用量不断增加,最终可能耗尽所有可用内存。内存泄漏通常发生在手动内存管理的语言中,如 C 和 C++,但在自动内存管理语言如 Java 和 Python 中也可能发生。内存泄漏是一个常见且严重的问题,通过正确的工具和方法可以有效地追踪和定位内存泄漏。在实际开发中,良好的编码习惯和定期的内存监控是预防内存泄漏的重要措施。

技术萌新缓缓升级ing 2857

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务 | 【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

君逍遥o 319

【JVM】如何定位、解决内存泄漏和溢出

如何定位JVM内存泄漏和内存溢出问题?实战干货!一文详聊!快速上手!

BugMan的博客 6777

海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)

海洋CMS admin_notify.php 接口处存在远程代码执行漏洞,经过身份验证的远程攻击者可利用该漏洞执行任意代码,写入后门文件,进而控制整个web服务器。

0xSec 2719

AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发

注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。

nihaoljq2010的博客 833

java内存泄漏分析

  java.lang.OutOfMemoryError是工作中常见的异常,今天介绍下如何分析java内存泄漏。   java内存分析工具很多,JDK安装目录下自带就有很多优秀的分析工具。分析堆栈时我比较推荐使用MAT,方便,快速。 安装MAT 打开eclipse --->help--->eclipse marketplace(我在公司一般会下载高版本的eclipse,它带有一个插...

wflh323的专栏 7155

3D 结构光相机工作原理全解 | 从编码投射到三维重建,原理 + 代码 + 工业实战一站式掌握

本文从3D结构光相机的整体架构出发,层层拆解了编码投射、相位计算、相位解包裹、三维重建的核心原理,补充了工业实战所需的公式推导、代码实现、参数调优、设备选型和案例落地,核心总结如下:相位是3D结构光成像的“灵魂”,其精度、稳定性直接决定3D重建的效果,包裹相位与绝对相位的区分的是工业实战的基础;编码投射的核心是“正弦条纹+格雷码条纹”组合,正弦条纹负责高精度相位提取,格雷码条纹辅助解包裹,适配工业场景的精度与稳定性需求;

getusushu的博客 418

JAVA内存泄漏与常见问题定位

JAVA后端开发知识总结(持续更新…) JAVA内存泄漏 文章目录JAVA内存泄漏一、内存溢出二、内存泄漏2.1 定位与解决 一、内存溢出   OutOfMemoryError:JVM内存过小;程序不严密,产生了过多的垃圾。其解决方法在于: 增加JVM的内存大小,特别是对启动参数内存值的设定。 从根本上解决Java内存溢出的唯一方法就是修改程序,及时地释放没用的对象,释放内存空间,避免死循环,防止一次载入太多的数据。 二、内存泄漏   内存泄露,是指程序在申请内存并且用完这块内存后(对象不再需要.

weixin_43415481的博客 2123

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

如何在 Java 中进行内存泄漏分析

确认是否发生内存泄漏:通过jstat观察 GC 状态,确认是否存在问题。生成和分析 Heap Dump:使用jmap获取 Heap Dump 文件,并利用 MAT 或 VisualVM 工具分析。定位问题和修复代码:找到内存泄漏的根源后,通过优化对象管理和生命周期修复问题。

Mylqs的博客 2472

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JAVA内存泄漏分析定位

1、为什么会发生内存泄漏 Java如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题。 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放,一切由jvm来进行处理,当java对象不再被应用时,等到堆内存不够用时,jvm会进行垃圾回收,清除这些对象占用的堆内存空间,如果对象一直被应用,jvm无法对其进行回收,创建新的对象时,无法从Heap中获取足够的内存分配给对象,这时候就会导致内存溢出。而出现内存泄露的地方,一般是不断的往容器中存放对象,而容器没有相

小小白兔兔 1269

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 应用内存泄漏的定位过程

最近,笔者负责测试的某个算法模块机器出现大量报警,报警表现为机器CPU持续高占用。该算法模块是一个优化算法,本身就是CPU密集型应用,一开始怀疑可能是算法在正常运算,但很快这种猜测就被推翻:同算法同学确认后,该算法应用只使用了一个核心,而报警时,一个算法进程占用了服务机器的全部8个核心,这显然不是正常计算造成的。首先按照CPU问题的定位思路进行定位,对 Java 调用堆栈进行分析:使用 查看 CPU 占用高的进程: ,从 top 命令的结果看,19272 号进程 CPU 占用率最高,基本确定问题是该进程引

2501_92608043的博客 781
上一篇: 大数据系统-图数据查询与存储
下一篇: 深度学习-深度学习开源框架汇总
gao8658
博客等级 码龄15年 203粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值