Java内存泄露是常常出现的问题,Java攀登网进行了该问题的整理,具体的如下所示:

1.2 内存泄露Memory Leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内

存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

在 Java中,内存泄漏就是存在一些被分配的对象,

这些对象有下面两个特点:

1)首先,这些 对象是可达的,即在有向图中,存在通路可以与其相连;

2)其次,这些对象是无用的,即 程序以后不会再使用这些对象。如果对象满足这两个条件,

这些对象就可以判定为Java中的 内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

关于内存泄露的处理页就是提 高程序的健壮型,因为内存泄露是纯代码层面的问题。

1.3 内存溢出和内存泄露的联系内存泄露会最终会导致内存溢出。相同点:都会导致应用程

序运行出现问题,性能下降或挂起。

不同点:1) 内存泄露是导致内存溢出的原因之一,内 存泄露积累起来将导致内存溢出。

2) 内存泄露可以通过完善代码来避免,内存溢出可以通 过调整配置来减少发生频率,

但无法彻底避免。

1、首先通过“虚拟机进程状况工具:jps”找出正在运行的虚拟机进程,最主要是找出这个 进程在本地

虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier),因为在后面 的排查过程中都是需要这个

LVMID来确定要监控的是哪一个虚拟机进程。同时,对于本地 虚拟机进程来说,LVMID与操作系统的进程ID

(PID,Process Identifier)是一致的,使 用Windows的任务管理器或Unix的ps命令也可以查询到虚拟机进程的LVMID。

2、找到你需要监控的ID(假设为20954),再利用“虚拟机统计信息监视工具:jstat”监视虚拟机各种运行状态信息。

3、分析方法通常有两种:

1)把堆dump下来再用MAT等工具进行分析,但dump堆 要花较长的时间,并且文件巨大,再从服务器上拖回本地导入工具,

这个过程有些折 腾,不到万不得已最好别这么干。2)更轻量级的在线分析,使用“Java内存影像工 具:jmap”生成堆转储快照

(一般称为headdump或dump文件)。

dump用jmat指令 4、定位到源代码分析。定位代码,有很多种方法,比如前面提到的通过MAT查看 Histogram即可找出是哪块代码。

查看哪个类的占用情况多,然后分析引用关系。都 在MAT里面的Histogram里面看即可。Java的内存泄露多半是因为对象存在无效的引用,

对象得不到释放,如果发现Java应 用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析:

1. 用工具 生成java应用程序的heap dump(如jmap)

2. 使用Java heap分析工具(如 MAT),找出内存占用超出预期的嫌疑对象3. 根据情况,分析嫌疑对象和其他对象的 引用关系。

4. 分析程序的源代码,找出嫌疑对象数量过多的原因。

1、什么是Dump文件 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。Dump文件是用来给驱动程序编

写人员调试驱动程序用的,这种文件必须用专用工具软件打 开。当我们的程序发布出去之后,在客户机上是无法跟踪代码的,所以Dump(扩展名是 .dmp)

文件对于我们来说特别重要。我们可以通过.dmp文件把出现问题的情况再现,然后 根据再现的状况(包括堆栈调用等情况),可以找到出现问题对应的行号。

Jstat是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java

应用程序的资源和性能 进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。https://www.jianshu.com/p/213710fb9e40命令jmap是一个

多功能的命令。它可以生成 java 程序的 dump 文件, 也可以 查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

(责任编辑:admin)