赛迪网 > IT技术 Java > 技术动态
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

JAVA基础:JSP中监测JVM的内存使用情况

发布时间:2008.02.29 04:54     来源:赛迪网    作者:myeclipse

公司有个jsp项目内存经常溢出,tomcat两个小时左右就停,我写了一个类对JVM的内存进行了监测.
===========================
 package cn.zhuangyan.util;

import java.util.Timer;
import java.util.TimerTask;
import java.util.Calendar;
import java.util.GregorianCalendar;
/**
 *
 * 

Title:GCTimerTask 


 *
 * @author zhuangyan
 * @msn:nacl_zhuang@hotmail.com
 * @qq:368924454
 * @version 1.0
 */
public class GCTimerTask
    extends TimerTask {

  private static GCTimerTask instance = null;
  public void run() {
    Calendar cal = new GregorianCalendar();
    int hour24 = cal.get(Calendar.HOUR_OF_DAY); // 0..23
    int min = cal.get(Calendar.MINUTE); // 0..59
    System.out.print("["+String.valueOf(hour24)+":"+String.valueOf(min)+"]");
    System.out.println("JVM可用内存:" + java.lang.Runtime.getRuntime().freeMemory() / (1024*1024)+"M/"+java.lang.Runtime.getRuntime().totalMemory()/ (1024*1024)+"M" );
    System.gc();
  }
  private void startWork()
  {
        Timer t = new Timer();
         t.schedule(instance,0,1000*60);
  }
  public static GCTimerTask getInstance()
  {
        if(instance==null)
        {
                instance = new GCTimerTask();
                instance.startWork();
        }
        return instance;
  }
}


这个类虽然简单,但初学者从中应该学到
1)timer类的用法
2)java.lang.Runtime.getRuntime().freeMemory(),java.lang.Runtime.getRuntime().totalMemory(),System.gc()
这三个方法的使用,需要说明的是System.gc()并不能强迫JVM马上释放内存,如果那样,我的内存溢出问题早就解决了.
3)getInstance()单例模式,
4)最后的就是怎么用这个类的问题,我把它放到了EncodingFilter类中,现在很多jsp程序中都有这个类吧,
public final void init(final FilterConfig arg0) throws ServletException {
      GCTimerTask.getInstance();
        this.filterConfig = arg0;
        this.encoding = filterConfig.getInitParameter("encoding");

        String value = filterConfig.getInitParameter("ignore");
        if (value == null) {

            this.ignore = true;
        } else if (value.equalsIgnoreCase("true")) {

            this.ignore = true;
        } else if (value.equalsIgnoreCase("yes")) {

            this.ignore = true;
        } else {

            this.ignore = false;
        }
    }
=====================================
下面是溢出时日志,高手帮看一下.
[9:42]JVM可用内存:405M/508M
java.lang.OutOfMemoryError
[9:43]JVM可用内存:405M/508M
[9:44]JVM可用内存:405M/508M
[9:45]JVM可用内存:405M/508M
[9:46]JVM可用内存:405M/508M
[9:47]JVM可用内存:405M/508M
[9:48]JVM可用内存:404M/508M
[9:49]JVM可用内存:405M/508M
[9:50]JVM可用内存:404M/508M
[9:51]JVM可用内存:405M/508M
[9:52]JVM可用内存:405M/508M
[9:53]JVM可用内存:404M/508M
[9:54]JVM可用内存:405M/508M
[9:55]JVM可用内存:404M/508M
[9:56]JVM可用内存:405M/508M
[9:57]JVM可用内存:405M/508M
[9:58]JVM可用内存:405M/508M
[9:59]JVM可用内存:405M/508M
[10:0]JVM可用内存:405M/508M
[10:1]JVM可用内存:399M/508M
[10:2]JVM可用内存:404M/508M
[10:3]JVM可用内存:404M/508M
[10:4]JVM可用内存:404M/508M
[10:5]JVM可用内存:405M/508M
java.lang.OutOfMemoryError

为什么显示的可用内存有400多M,还OutOfMemoryError?在window的资源管理器中看tomcat的内存用量是持续增加的,它和 java.lang.Runtime.getRuntime().freeMemory()是什么区别啊?
溢出时在window资源管理器中tomcat内存占300多M,MSSQL内存也差不多到300M了.有什么办法可以定时重启这两个服务呢,我写了一个程序,在XP下可用.但2000下不能用. 
         (责任编辑:包春林)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· J2SE综合:两种Java容器类List和Set分析 (02-28) · Java语言深入--抽象类和接口的区别 (02-28)
· Java语言深入:浅析Java语言中的内部类 (02-28) · 对使用jfreechart的源代码进行注释说明 (02-28)
· 高级:lucene全文检索应用示例及代码简析 (02-28) · 使用Spring更好地处理Struts动作 (02-28)
· J2SE综合--Java 5.0 多线程编程实践 (02-28) · 开发框架--Hibernate中各个包的作用 (02-27)
· 基础:Java/J2EE中文问题终极解决之道 (02-27) · JAVA语言操作数据库方式与设计模式应用 (02-27)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 网银交易收费 我国银行业如何达国际化标准
· 家庭信息化普及率提高 网上缴费成为新时尚
· 五条黄金准则能够让CIO巧妙加薪 CIO焦虑调查
· 网上书店解决方案 深圳边检指挥中心ITSM项目
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统