`
arksea
  • 浏览: 64027 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Java资源泄露监控库jleaks

    博客分类:
  • java
阅读更多

jleaks

    Java Resource Leaks Monitor,用于Java资源泄露检测,代码的GITHUB地址 

    当程序库的作者向用户提供一个使用后需要释放资源的类,通常都苦恼如何保证用户的这个行为。Java的类不像C++拥有析构函数,对于库的提供者,C++程序员面对上述问题只要简单的在析构函数中释放其资源即可,但是Java通常是提供一个close()方法给使用者,要求使用者主动调用去释放资源,但是如果使用者没有调用,作为库本身也没有什么办法。这个资源释放的需求,在复杂的系统中,有时会形成一个链条,任何一个环节用户疏忽了,都会造成之后所有的资源产生泄露。

    jleaks就给程序库提供了检测用户的不正确使用造成的资源泄露的能力。为什么是给程序库提供这种能力,而不是让库的用户直接使用呢?因为如果要求库的使用者直接应用这种功能,你说如果用户不记得通过finally或者JDK7的新特性try-with-resource语法去保障资源的释放,同样会不记得将资源向检测工具类注册呀。但是对于库的提供者,一旦你通过细致的工作,将所有的需要用户释放的资源都进行了注册,那么这种细致将会被“遗传”到整个使用你的类库的所有代码中去,这种保障将是静态的,传播的,不依赖于使用者的。

    使用这个类很简单,只要将资源注册一下即可。如果用户在使用这个资源对象后没有调用清除方法,这个类就会检测到并记录一条带有栈信息的日志去警告使用者,让我们可以很容易的找到资源创建的源头。

    下面将演示这个类的两种使用模式,首先来看模式一。假设我们的程序库有一个提供给用户的资源接口,我们可以让这个资源接口继承自IDisposable,并希望用户使用完后调用dispose()方法:

import arksea.jleaks.IDisposable;
public interface IMyConnection extends IDisposable {
    public void fun1();
    public void fun2();
}

  其中用到工具类中的IDisposable接口的定义如下:

public interface IDisposable {
    public boolean isDisposed();
    public void dispose();
}

     我们只要简单的在MyConnectionImpl实现类的构造函数中,将自身向资源泄露监控类注册一下即可:

public class MyConnectionImpl implements IMyConnection{
    public MyConnectionImpl(){
        ResourceLeaksMonitor.register(this);
    }
    private volatile boolean disposed = false; //注意保证线程安全

    ......

    @Override
    public boolean isDisposed() {
        return disposed;
    }

    @Override
    public void dispose() {
        this.disposed = true;
        //在此处释放资源
    }
}

    好了,就这么简单。现在来看看,当我们将这个类库打包分发给用户使用时,如果用户没有对资源进行释放工作将会发生什么:

DOMConfigurator.configure("log4j.xml");
//启动资源泄露监控,当然你也可以放在其他的系统初始化封装中,避免直接用户需要自己关心此功能的开启
//参数是检测周期(GC),这里用1秒只是因为是demo,实际应用中可以配置成30秒或者更长时间
//当然系统上线时这句就可以注释掉了
ResourceLeaksMonitor.startMonitor(1); 
IMyConnection conn2 = new MyConnectionImpl();
conn2.fun1();
conn2.fun2();
//conn2.dispose();  //故意不进行资源释放
conn2 = null;       //模拟资源泄露
Thread.sleep(5000);

    运行程序你将得到如下的提示日志

2014-11-13 16:19:34 ERROR arksea.jleaks.ResourceLeaksMonitor.checkResource(ResourceLeaksMonitor.java:183)
资源泄漏警告,使用完arksea.jleaks.demo2.MyConnectionImpl后未调用despose()进行资源释放 ; 
 java.lang.Exception: 资源初始化跟踪信息
    at arksea.jleaks.ResourceLeaksMonitor.register(ResourceLeaksMonitor.java:134)
    at arksea.jleaks.demo2.MyConnectionImpl.<init>(MyConnectionImpl.java:13)
    at arksea.jleaks.demo.Main.main(Main.java:29)

 

     第二种模式的使用情景是,这个资源是第三方提供的,并没有实现IDisposable接口 假设以下是第三方库的接口定义:

public interface IThirdPartyConnection extends Closeable{
    public void fun1();
    public void fun2();
}

    我们可以为用户提供一个资源创建工厂,在工厂中创建资源并进行注册:

public class ConnectionFactory {
    public static IThirdPartyConnection create() {
        ThirdPartyConnectionImpl conn = new ThirdPartyConnectionImpl();
        return (IThirdPartyConnection)ResourceLeaksMonitor.register(conn, "close", IThirdPartyConnection.class);
    }
}

    同样的,下面演示一下没有进行资源释放的结果:

DOMConfigurator.configure("log4j.xml");
//启动资源泄露监控,上线的时候可以不开启
ResourceLeaksMonitor.startMonitor(1);
IThirdPartyConnection conn1 = ConnectionFactory.create();
conn1.fun1();
conn1.fun2();
//conn1.close(); //故意不进行资源的清理工作
conn1 = null;    //模拟资源泄露
Thread.sleep(5000);

     程序运行后的结果

2014-11-13 16:19:34 ERROR arksea.jleaks.ResourceLeaksMonitor.checkResource(ResourceLeaksMonitor.java:175)
资源泄漏警告,使用完arksea.jleaks.demo1.ThirdPartyConnectionImpl后未调用close()进行资源释放 ; 
 java.lang.Exception: 资源初始化跟踪信息
    at arksea.jleaks.ResourceLeaksMonitor.register(ResourceLeaksMonitor.java:110)
    at arksea.jleaks.demo1.ConnectionFactory.create(ConnectionFactory.java:14)
    at arksea.jleaks.demo.Main.main(Main.java:25)

 

jleaks库已上传到OSChina的Maven库,可以在项目中直接引用:

 

gradle

repositories {
    maven { url "http://maven.oschina.net/content/repositories/thirdparty" }
}

dependencies {
    compile "net.arksea:jleaks:1.0.0"
}

 

maven

<repositories>
  <repository>
    <id>public</id>
    <url>http://maven.oschina.net/content/repositories/thirdparty</url>
  </repository>
</repositories>
 
<dependency>
  <groupId>net.arksea</groupId>
  <artifactId>jleaks</artifactId>
  <version>1.0.0</version>
</dependency>

 

 

 

分享到:
评论

相关推荐

    java服务器资源监控脚本.zip

    在IT行业中,对服务器资源进行监控是至关重要的,特别是在运行Java应用程序时。"java服务器资源监控脚本.zip"这个压缩包文件提供了一系列工具和脚本,用于帮助我们追踪和分析服务器上的关键性能指标。这些工具通常...

    基于JAVA网络远程监控系统软件的实现(源码)

    基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的实现(源码)基于JAVA网络远程监控系统软件的...

    JAVA实时屏幕监控

    总结这些信息,我们可以推断这个压缩包包含了一个基于Java的屏幕监控解决方案,包括源代码、一个依赖的本地库、主执行文件和程序配置。开发人员可以通过研究源码来学习如何构建类似的系统,或者直接使用提供的工具...

    Java 开发资源库.exe

    Java 开发资源库.exe

    Java实现服务器监控相关代码

    Java实现服务器监控相关代码,使用Maven引入了系统服务jar包. 包含:CPU相关信息、內存相关信息、JVM相关信息、服务器相关信息、磁盘相关信息。 CPU相关信息:核心数 CPU总的使用率 CPU系统使用率 CPU用户使用率等

    Java 开发资源库.rar

    一、Windows 7和Vista系统下使用Java 开发资源库报错或无法运行 在Windows 7和Vista系统下使用Java 开发资源库要设置Java 开发资源库.exe的兼容性。设置方法如下: 1、打开“Java 开发资源库”文件夹,右键单击...

    Java开发资源库

    Java开发资源库是一个全面的学习平台,专为Java初学者和有经验的开发者提供从入门到精通的全方位指导。这个资源库包含了大量的实例和项目,帮助用户深入理解和实践Java编程语言的核心概念和技术。以下是对资源库中...

    基于JAVA CS远程监控系统软件的实现源代码

    基于Java CS远程监控系统软件的设计与实现项目是一款基于Java语言开发的远程监控软件,主要应用Java Socket和Java AWT等技术,实现对远程设备的实时监控和控制。该系统可为企业、学校、政府等单位提供便捷和安全的...

    Java实现实时监控目录下文件变化的方法

    Java实现实时监控目录下文件变化的方法 Java实现实时监控目录下文件变化的方法是指通过Java语言来实现实时监控目录下文件的变化情况,包括文件的创建、删除、修改等操作。这种方法可以应用于各种场景,例如文件系统...

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

    "Java内存泄露_JVM监控工具介绍" Java内存泄露是Java开发中常见的一种问题,发生内存泄露可能会导致Java应用程序崩溃或性能下降。在Java中,内存泄露的原因非常多样,例如,静态变量、循环引用、数据库连接池、...

    Java软件开发魔典资源库 学习笔记

    Java软件开发魔典资源库 学习笔记 Java软件开发魔典资源库 学习笔记 Java软件开发魔典资源库 学习笔记 Java软件开发魔典资源库 学习笔记 Java软件开发魔典资源库 学习笔记 Java软件开发魔典资源库 学习笔记 Java软件...

    java资源Java加密库JSDSIjava资源Java加密库JSDSI

    java资源Java加密库 JSDSIjava资源Java加密库 JSDSI提取方式是百度网盘分享地址

    java使用jni技术对硬件平台的资源进行监控

    Java 使用 JNI 技术对硬件平台的资源进行监控是一个复杂而关键的任务,涉及到多个技术领域。JNI,全称为 Java Native Interface,是 Java 平台的一部分,允许 Java 代码和其他语言写的代码进行交互。通过 JNI,Java ...

    Sigar Java实现系统监控

    在Java环境中,通过Sigar库,开发者可以方便地实现系统监控功能。本篇文章将深入探讨如何使用Sigar在Java中进行系统监控,并介绍相关的代码实现和包含的库文件。 首先,要使用Sigar进行Java系统监控,你需要下载...

    使用java开发的监控系统。

    RedCube是用 Java开发的用于应用检测,主机检测(cpu,磁盘,内存), 数据库检测,可以提前解决隐藏问题的软件;该软件分服务端和客户端,可将客户端部署在多台主机,服务端负责收集数据并展示数据. 特点:支持APP...

    java资源Java计算机视觉库BoofCV

    java资源Java 计算机视觉库 BoofCV提取方式是百度网盘分享地址

    java监控开发示例

    这个“java监控开发示例”旨在提供一种方法来实现这一目标,通过Java代码远程监控系统资源,如CPU使用率、内存占用、磁盘空间以及网络状态等。 首先,我们需要理解Java中用于系统监控的基础概念和技术。Java提供了...

    java实现自定义Weblogic监控

    java实现自定义Weblogic监控java实现自定义Weblogic监控java实现自定义Weblogic监控

Global site tag (gtag.js) - Google Analytics