Java内存泄漏及检测方法

开发 后端
本文讨论Java内存泄漏的概念,Java语言的内存管理机制,垃圾回收器的原理,结合实际代码分析Java语言中可能存在的内存泄漏问题,并列举几种常见的检测及防止内存泄漏的方法。

你对Java内存泄漏的概念是否了解,这里和大家分享一下,Java内存泄漏是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。关于内存泄露问题对于c/c++来说,这个应该是比较常见的问题。
  
一、引言
  
  所谓Java内存泄漏,是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。关于内存泄露问题,对于c/c++来说,这个应该是比较常见的问题。对于Java语言,由于Java通过垃圾收集器(GarbageCollecti-On,GC)自动管理内存的回收,程序员不需要通过调用函数来释放内存。因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。

其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。随着越来越多的服务器程序采用Java技术,例如JSP,Servlet,EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。

二、Java管理内存的方法
  
(一)Java垃圾回收器原理

  Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都在堆(Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。

  监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象(连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。

(二)什么是Java内存泄漏

  下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。通过分析,我们得知,对于C++,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式,Java提高了编程的效率。因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语言上保证,任何对象都是可达的,所有的不可达对象都由GC管理。
  
三、如何检测Java内存泄漏
  
  最后一个重要的问题,就是如何检测Java的内存泄漏。目前,我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查Java内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括OptimizeitProfiler,JProbeProfiler,JinSight,Rational公司的Purify等。
  
四、结束语
  
  综上所述,Java也存在内存泄露问题,其原因主要是一些对象虽然不再被使用,但它们仍然被引用。为了解决这些问题,我们可以通过软件工具来检查内存泄露,检查的主要原理就是暴露出所有堆中的对象,让程序员寻找那些无用但仍被引用的对象。
 

【编辑推荐】

  1. Java内存泄漏的检测和处理
  2. 可能导致Java内存泄漏的几项原因
  3. JVM.dll装载过程与源代码分析
  4. 巧解使Eclipse崩溃的JVM terminated问题
  5. 解决JVM Terminated.ExitCode=-1问题行之有效的方法

 

 

责任编辑:佚名 来源: hi.baidu.com
相关推荐

2018-12-07 10:52:08

内存泄漏方法

2010-09-26 15:38:33

JVM内存泄漏

2009-06-16 11:20:22

内存泄漏

2015-07-10 09:15:47

LeakCanary内存泄漏

2023-10-31 16:40:38

LeakCanary内存泄漏

2011-06-16 09:28:02

C++内存泄漏

2010-09-25 11:32:24

Java内存泄漏

2024-03-11 08:22:40

Java内存泄漏

2019-01-30 18:24:14

Java内存泄漏编程语言

2022-09-28 10:35:31

JavaScript代码内存泄漏

2012-06-19 15:12:20

Java内存泄露

2011-01-14 17:00:11

Linux内存泄露

2009-06-16 11:17:49

内存泄漏

2021-03-04 17:21:49

内存检测泄漏

2021-11-05 08:28:27

内存泄漏调试

2015-04-17 10:35:51

c++c++程序内存泄漏检测代码

2024-01-30 10:12:00

Java内存泄漏

2016-08-22 08:36:14

ReactiveCoc内存泄漏GitHub

2012-02-22 21:28:58

内存泄漏

2023-12-18 10:45:23

内存泄漏计算机服务器
点赞
收藏

51CTO技术栈公众号