`
arksea
  • 浏览: 63761 次
  • 性别: 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 服务器信息监控

    在"Java 服务器信息监控"项目中,开发者可以编写代码来获取不同操作系统(如Windows、Linux)下的系统资源信息。这些信息包括但不限于CPU利用率、内存使用情况、网络接口状态以及服务运行状态。 首先,让我们关注...

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

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

    Java 开发资源库.exe

    Java 开发资源库.exe

    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提取方式是百度网盘分享地址

    Sigar Java实现系统监控

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

    使用java开发的监控系统。

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

    基于JAVA CS远程监控系统软件的实现(源代码+文档).zip

    Java CS远程监控系统是一种采用客户端-服务器(Client-Server,CS)架构的软件应用,它允许用户通过网络对远程设备或系统进行实时监控。在这个基于Java实现的系统中,我们通常会利用Java的强大特性和丰富的类库来...

    java监控开发示例

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

    java实现自定义Weblogic监控

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

    (Java毕业设计)基于JAVA CS远程监控系统软件的实现(源代码+).rar

    (Java毕业设计)基于JAVA CS远程监控系统软件的实现(Java毕业设计)基于JAVA CS远程监控系统软件的实现(Java毕业设计)基于JAVA CS远程监控系统软件的实现(Java毕业设计)基于JAVA CS远程监控系统软件的实现(Java毕业...

    Java 运行时监控

    在Java世界中,监控主要包括对内存使用、CPU消耗、线程状态、I/O操作以及各种系统资源的监控。通过有效的监控,我们可以更好地理解代码在实际运行环境中的行为,从而优化性能,减少故障。 首先,让我们关注"Java...

    Java实现本机屏幕监控+源码

    在本文中,我们将深入探讨如何使用Java语言实现本机屏幕监控功能。屏幕监控是指通过程序实时捕获并处理计算机屏幕的图像数据,从而达到类似直播视频的效果。这在远程协助、教学演示、会议记录等场景中有着广泛的应用...

    基于java远程监控软件

    首先,Java作为跨平台的编程语言,其Java SE(标准版)库提供了丰富的API,使得开发者能够构建分布式系统,如远程监控软件。核心类库如`java.net`和`java.io`为网络通信和数据传输提供了基础。 1. **网络编程**:在...

Global site tag (gtag.js) - Google Analytics