Java编写服务器监控程序 (java写的服务器监控程序)

随着互联网的不断发展,服务器的作用越来越重要。然而,服务器的稳定性和可靠性也成为了企业和个人关注的问题,因此,服务器监控程序也变得越来越需要。是一种比较流行的方式。本文将介绍如何使用。

一、准备工作

Java是一种跨平台的编程语言,所以在开发服务器监控程序之前,要先确保Java环境正确安装。具体操作如下:

1.下载Java JDK,下载地址为https://www.oracle.com/java/technologies/javase-downloads.html。

2.安装Java JDK,安装时注意选择对应操作系统的版本。

3.配置Java环境变量,将安装路径添加到系统环境变量中。

完成以上三步,Java环境就可以使用了。

二、理解服务器监控程序的作用

服务器监控程序可以监控服务器的运行状况和服务状态,及时发现和解决问题。通过监控程序,可以及时发现服务器负载过高、磁盘空间不足、服务异常等问题,并及时采取措施解决问题,保证服务器的稳定性和可靠性。

三、开发服务器监控程序

在开发服务器监控程序前,需要确定监控内容和监控方式。选择合适的监控方式可以降低监控程序的资源占用率。以下是开发监控程序的几个步骤:

1.确定监控内容

根据实际需求确定监控内容。例如,CPU使用率、内存使用情况、网络流量、磁盘空间、服务状态等。

2.选择监控方式

可以使用轮询或者事件驱动的方式进行监控。轮询方式是通过定时查询服务器状态,获取监控数据;事件驱动是通过注册事件,当事件发生时触发监控程序。事件驱动的方式可以减少程序的资源占用率,但需要了解更多的技术细节,可根据实际需求进行选择。

3.选择开发框架

选择合适的开发框架有利于提高编程效率和性能,如Spring Boot、Dropwizard、Micronaut等。

4.编写代码

编写代码时要注意代码的重用性和稳定性。可以参考以下代码示例:

“`java

public class ServerMonitor {

// 监控间隔时间,单位为秒

private static final int MONITOR_INTERVAL = 60;

public static void mn(String[] args) throws Exception {

// 创建计划任务

Timer timer = new Timer();

timer.schedule(new MonitorTask(), 0, MONITOR_INTERVAL * 1000);

}

}

class MonitorTask extends TimerTask {

@Override

public void run() {

try {

// 获取CPU使用率

double cpuUsage = SystemInfo.getCpuUsage();

// 获取内存使用情况

MemoryUsageResult memUsage = SystemInfo.getMemoryUsage();

// 获取磁盘空间

List diskUsage = SystemInfo.getDiskUsage();

// 获取服务状态

ServiceStatus serviceStatus = SystemInfo.getServiceStatus(“Tomcat”);

// 输出监控信息

System.out.println(“CPU使用率:” + cpuUsage);

System.out.println(“内存使用情况:” + memUsage);

System.out.println(“磁盘空间:” + diskUsage);

System.out.println(“服务状态:” + serviceStatus);

} catch (Exception e) {

e.printStackTrace();

}

}

}

“`

四、

相关问题拓展阅读:

详解Java语言中内存泄漏及如何检测问题 (1)

因此,很多程序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责任,而是GC或JVM的问题。其实,这种想法是不正确的,因为Java也存在内存泄露,但它的表现与C++不同。 随着越来世谈轿越多的服务器程序采用Java技术,例如P,Servlet, EJB等,服务器程序往往长期运行。另外,在很多嵌入式系统中,内存的总量非常有限。内存泄露问题也就变得十分关键,即使每次运行少量泄漏,长期运行之后,系统也是面临崩溃的危险。 Java是如何管理内存为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为搜肆每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。 监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。 为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向图中,根顶点可达的对象都是有效对象,GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达,那么我们认为这个(这些)对象不再被引用,可以被GC回收。 以下,我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况。以下右图,就是左边程序运行到第6行的示意图。 Java使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。这种方式的优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低(很难处理循环引用的问题),但执行效率很高。 什么是Java中的内存泄露下面,我们就可以描述什么是内存泄漏。在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定侍毁为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。 在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空间,然后却不可达,由于C++中没有GC,这些内存将永远收不回来。在Java中,这些不可达的对象都由GC负责回收,因此程序员不需要考虑这部分的内存泄露。 通过分析,我们得知,对于C++,程序员需要自己管理边和顶点,而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式,Java提高了编程的效率。 因此,通过以上分析,我们知道在Java中也有内存泄漏,但范围比C++要小一些。

一般来说内存泄漏有两种情况。一种情况,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值);另一种情况则是在内存对象明明已经不需要的时候,还仍然保留着这块内存和它的访问方式(引用)。之一种情况,在Java中已经由于垃圾回收机制的引入,得到了很好的解决。所以,Java中的内存泄漏,主要指的是第二种情况。

可能光说概念太抽象了,大家可以看一下这样的例子:

1 Vector v=new Vector(10);

2 for (int i=1;i

3 Object o=new Object();

4 v.add(o);

5 o=null;

6 }

在这个例子中,代码栈中存在Vector对象的引用v和Object对象的引用o。在For循环中,我们不断的生成新的对象,然后将其添加到Vector对象中,之后将o引用置空。问题是当o引用被置空后,如果发生GC,我们创建的Object对象是否能够被GC回收呢?答案是否定的。因为,GC在跟踪代码栈中的引用时,会发现v引用,而继续往下跟踪,就会发现v引用指向的内存空间中又存在指向Object对象的引用。也就是说尽管o引用已经被置空,但是Object对象仍然存在其他的引用,是可以被访问到的,所以GC无法将其释放掉。如果在此循环之后,Object对象对程序已经没有任何作用,那么我们就认为此Java程序发生了内存泄漏。

尽管对于C/C++中的内存泄露情况来说,Java内存泄露导致的破坏性小,除了少数情况会出现程序崩溃的情况外,大多数情况下程序仍然能正常运行。但是,在移动设备对于内存和CPU都有较严格的限制的情况下,Java的内存溢出会导致程顷亏序效率低下、占用大量不需要的内存等问题。这将导致整个机器性能变差,严重的也会引起抛出OutOfMemoryError,导致程序崩溃。

一般情况下内存泄漏的避免

在不涉及复杂数据结构的一般情况下,Java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。

例如:

1 public class FileSearch{

2

3 private byte content;

4 private File mFile;

5

6 public FileSearch(File file){

7 mFile = file;

8 }

9

10 public boolean hasString(String str){

11 int size = getFileSize(mFile);

12 content = new byte;

13 loadFile(mFile, content);

14

15 String s = new String(content);

16 return s.contains(str);

17 }

18 }

在这段代码中,FileSearch类中有一个函数hasString,用来判断文档中是否含有指定的字符串。流程是先将mFile加载到内存中,然后进行判断。但是,这里的问题是,将悄乎拿content声明为了实例变量,而不是本地变量。于是,在此函数返回之后,内存中仍然存在整个文件的启搭数据。而很明显,这些数据我们后续是不再需要的,这就造成了内存的无故浪费。

要避免这种情况下的内存泄露,要求我们以C/C++的内存管理思维来管理自己分配的内存。之一,是在声明对象引用之前,明确内存对象的有效作用域。在一个函数内有效的内存对象,应该声明为local变量,与类实例生命周期相同的要声明为实例变量……以此类推。第二,在内存对象不再需要时,记得手动将其引用置空。

复杂数据结构中的内存泄露问题

在实际的项目中,我们经常用到一些较为复杂的数据结构用于缓存程序运行过程中需要的数据信息。有时,由于数据结构过于复杂,或者我们存在一些特殊的需求(例如,在内存允许的情况下,尽可能多的缓存信息来提高程序的运行速度等情况),我们很难对数据结构中数据的生命周期作出明确的界定。这个时候,我们可以使用Java中一种特殊的机制来达到防止内存泄露的目的。

Java2下Applet数字签名实现方法

Java2下Applet数字签名具体实现方法我的项目是使用APPLET制作一个实时消息队列监控程序,由于涉及到了本地资源,对APPLET一定要进行数字签名和认证。我使用的环境是WINDOWS2023,应用服务器是WEBLOGIC6.0,开发环境是JBUILDER4.0。之前我提醒大家一定要注意服务器端和客户端的概念。那些文件应该在服务器端,那些文件应该在客户端。

首先在客户端使用JRE1.3.0_01(JAVA运行环境1.3.0.1版本)以取代IE的JVM(JAVA虚拟机),可以到

www.JAVA.SUN.COM

网站上去下载,下载好了先在客户端安装好,安装过程非常简单。

在服务器端的调用APPLET的HTML文件中也需要将它包含进来,以便没有事先安装JRE的客户端下载,具体的写法,请接着往下看;

具体步骤如下:

服务器端:

1.将程序需要用到的各种包文件全部解压(我这儿要用到WEBLOGIC的JMS包使用命令jar xf weblogicc.jar),然后使用JDK的打包命令将编译好的监控程序.class和刚才解压的包一起打包到一个包中。纤誉拦(前提我已经将监控程序和解开的包都放在同一个目录下了),都是dos状态下的命令,具体命令见jdk1.3(1.2)的bin目录下,

命令如下:

jar cvf monitor.jar *.class

此命令生成一个名为monitor.jar的包

2.为刚才创建的包文件(monitor.jar)创建keystore和keys。其中,keystore将用来存放密匙(private keys)和公共钥匙的认证,alias别名这儿取为monitor。

命令如下:

keytool -genkey -keystore monitor.keystore –alias monitor

此命令生成了一个名为monitor.keystore的keystore文件,接着这条命令,系统会问你好多问题,比如你的公司名称,你的地址,你要设定的密码等等,都由自己的随便写。

3.使用刚才生成的钥匙来对jar文件进行签名

命令如下:

jarsigner -keystore monitor.keystore monitor.jar monitor

这个命令将对monitor.jar文件进行签名,毁胡不会生成新文件。

4.将公共钥匙导入到一个cer文件中,这个cer文件就是要拷贝到客户端的唯一文件 。

命令如下:

keytool -export -keystore monitor.keystore -alias monitor -file monitor.cer

此条命令将生成monitor.cer认证文件,当然这几步都有可能问你刚才设置的密码。这样就完成了服务器端的设置。这时你就可以将jar文件和keystore文件以及cer文件(我这儿是monitor.jar,monitor.keystore,monitor.cer)拷贝到服务器的目录下了,我用的是weblogic6.0,所以就拷贝到C:\bea\wlserver6.0\config\mydomain\applications\DefaultWebApp_myserver下的自己建的一个目录下了。

客户端:

1. 首先应该安装jre1.3.0_01,然后将服务器端生成的monitor.cer 文件拷贝到jre的特定目录下,我这儿是:虚冲

c:\program files\javasoft\jre\1.3.0_01\lib\security目录下。

2. 将公共钥匙倒入到jre的cacerts(这是jre的默认keystore)

命令如下:

keytool -import -alias monitor -file monitor.cer

-keystore cacerts

注意这儿要你输入的是cacerts的密码,应该是changeit,而不是你自己设定的keystore的密码。

3. 修改policy策略文件,在dos状态下使用命令 policytool

系统会自动弹出一个policytool的对话框,如图4所示,在这里面首先选择file菜单的open项,打开c:\program files\javasoft\jre\1.3.0_01\lib\security目录下的java.poliy文件,然后在edit菜单中选择Change keystore ,在对话框中new keystore url:中输入

file:/c:/program files /javasoft/jre/1.3.0_01/lib/security/cacerts, 这儿要注意反斜杠,在new keystore type 中输入JKS,这是cacerts的固定格式,然后单击Add Policy Entry,在出现的对话框中CodeBase中输入:

*

其中的URL是服务器的IP地址,7001是我的weblogic的端口,如果你是在别的应用服务器上比如说是apache,那端口号就可以省略掉。

在SignedBy中输入(别名alias):这儿是Monitor然后单击add peimission按钮,在出现的对话框中permission中选择你想给这个applet的权限,这儿具体有许多权限,读者可以自己找资料看看。我这儿就选用allpeimission,右边的signedBy中输入别名:monitor

最后保存,在file菜单的save项。

当然你可以看见我已经对多个包实现了签名认证。

这样客户端的设置就完成了。在客户端用ie运行该applet程序时,会询问你是不是对该签名授权,选择授权后,包会自动从服务器下载到本地计算机,而且ie会自动启动jre,在右下栏中可以看见,相当于ie的java控制台。

4.调用applet的html文件

大家都知道由于java2的安全性,对applet的正常调用的html文件已经不能再使用了,而改为ActiveX类型的调用。具体的又分ie和nescape的不同写法,这一些在sun网上都能找到现成的教程。我就不多说了,只是将我的这个小程序为ie写的的html给大家看看。

<html>

<META HTTP-EQUIV=”Content-Type” CONTENT=”text/html;CHARSET=gb2312″>

<center>

<h3>消息中心实时监控平台</h3>

<hr>

<OBJECT classid=”clsid:8AD9CE-11D1-B3EF499D93″

width=”900″ height=”520″ align=”baseline” codebase=”

,3,0,0″>

<PARAM NAME=”java_code” VALUE=”wise.monitor.applet.monitorApplet”>

<PARAM NAME=”java_codebase” VALUE=”monitor/classes”>

<PARAM NAME=”java_type” VALUE=”application/x-java-applet;version=1.3″>

<PARAM NAME=”ARCHIVE” VALUE=”monitor.jar” >

<PARAM NAME=”scriptable” VALUE=”true”>

</OBJECT>

</center>

</html>

其中我要强调一点,因为applet每一次的改动都需要重新打包签名,手续非常繁琐,所以在具体的实现中要将一些会变化参数放到html文件中来,传到applet中去,这一点网上文章好多,自己去看吧。

另外一个就是有朋友问我,那这样不是太麻烦了,每一个客户端都要进行复杂的dos命令操作,我只能说一目前我的水平只能将一个已经做好的客户端文件cer文件和java.policy以及cacerts文件直接拷贝到客户端,当然这也有缺陷,如果别人的计算机已经有了认证,就会丢失。就这些问题我们可以一起探讨。

另外还有一点优化,就是在打包的时候,我这儿只讲了把所有要用的涉及到安全性的包和源程序到要打到一个包中。这样如果包非常大的话,会非常影响下载的速度,如果可以使用本地计算机的包就好了,这一点jre也做到了,具体的要到控制面板的jre控制台上去设置。这个就留着读者自己去摸索吧。

结束语

我发现网上java相关的资料非常少,中文的更少,所以希望自己能将一些小知识和大家共享,省掉许多重复的无用功。如果大家对这个问题还有不清楚的地方,或者就这问题相进一步展开讨论的,请和我联系,。希望我们能共同进步!

  Java2下Applet数字签名实现过程如下:

  在代码的分发端:

  (1)开发Java源程序并对其进行编译。

  (2)用JAR工具对类文件和资源文件进行封装。

  (3)用keytool创建公钥和密钥,生成X。509V1签名证书,输出证书。

  (4)通过jarsigner工具用生成的密钥对JAR文件进行数字签名。

  在代码的接收端:

  (1)用keytool输入证书视其为可信任。

  (2)用policytool创建和修改安全性策略配置文件,授权请求的访问权限。

  (3)从网络取得字节梁搜码,用公钥验证数字签名证书和文档代码的完整性。

  (4)验证字节码的合法性,根据策略文件分配相应权限。

  (5)执行代码,完成后被垃圾回收器回收内存。

  在用公钥验证数字签名证书之前,接收方需要确好盯认公钥自身的可靠性,因此通常情况是提供一个包含公钥的证书而不是公钥自身。1个证书包括:

  (1)1个公钥。

  (2)1个唯一的名字实体(个人或公司),它是证橡袜历书的所有者,包含用户名字、公司、组织、城市、地址、国家代码、省份等信息。

  (3)数字签名:1个证书被1个分发者的实体签名,保证证书确实包含另1个实体(所有者)的公钥。

关于java写的服务器监控程序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » Java编写服务器监控程序 (java写的服务器监控程序)