Window下TOMCA优化与监控

    技术2022-05-12  34

     

     1.如果是 安装版的直接安装。若是绿色版的安装成服务.进入bin目录 service.bat  install/remove 服务名。

     2.通常我们经常修改catalina.bat文件优化Tomcat配置

    set CATALINA_OPTS=-Xms1024m -Xmx1024m -Dcom.sun.management.jmxremoteset JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=200m -XX:MaxNewSize=299m -XX:MaxPermSize=299m  -Djava.awt.headless=true -Dwt.context.defaultLocalResourcesOnly=true

    这样的修改只在用startup.bat才起作用.

    3.如果我们服务的形式来启动的,就必须修改注册表HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Procrun 2.0/tomcat6/Parameters/Java/Options项下添加以下值:

    -Xms1024m-Xmx1024m-XX:PermSize=200m-XX:MaxNewSize=299m-XX:MaxPermSize=299m-Djava.awt.headless=true-Dwt.context.defaultLocalResourcesOnly=true

    上面的是以内存为2G的为标准设置的。

    4.设想构造一个监听器,假如可用内存低于20%时候就发送邮件,人为干预.这里设置TOMCAT内存值为1G,即使低于20%可用内存还有200M,所以不至于发生TOMCAT死掉,而邮件发不出来.

    package com.util; public class MonitorInfoBean { /** *//** 可使用内存. */ private long totalMemory; /** *//** 剩余内存. */ private long freeMemory; /** *//** 最大可使用内存. */ private long maxMemory; /** *//** 操作系统. */ private String osName; /** *//** 总的物理内存. */ private long totalMemorySize; /** *//** 剩余的物理内存. */ private long freePhysicalMemorySize; /** *//** 已使用的物理内存. */ private long usedMemory; /** *//** 线程总数. */ private int totalThread; /** *//** cpu使用率. */ private double cpuRatio; public long getFreeMemory() { return freeMemory; } public void setFreeMemory(long freeMemory) { this.freeMemory = freeMemory; } public long getFreePhysicalMemorySize() { return freePhysicalMemorySize; } public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { this.freePhysicalMemorySize = freePhysicalMemorySize; } public long getMaxMemory() { return maxMemory; } public void setMaxMemory(long maxMemory) { this.maxMemory = maxMemory; } public String getOsName() { return osName; } public void setOsName(String osName) { this.osName = osName; } public long getTotalMemory() { return totalMemory; } public void setTotalMemory(long totalMemory) { this.totalMemory = totalMemory; } public long getTotalMemorySize() { return totalMemorySize; } public void setTotalMemorySize(long totalMemorySize) { this.totalMemorySize = totalMemorySize; } public int getTotalThread() { return totalThread; } public void setTotalThread(int totalThread) { this.totalThread = totalThread; } public long getUsedMemory() { return usedMemory; } public void setUsedMemory(long usedMemory) { this.usedMemory = usedMemory; } public double getCpuRatio() { return cpuRatio; } public void setCpuRatio(double cpuRatio) { this.cpuRatio = cpuRatio; } } package com.util; public interface IMonitorService { /** *//** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception * @author */ public MonitorInfoBean getMonitorInfoBean() throws Exception; } package com.util; import java.io.InputStreamReader; import java.io.LineNumberReader; import sun.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; /** *//** * 获取系统信息的业务逻辑实现类. * @author */ public class MonitorServiceImpl implements IMonitorService { private static final int CPUTIME = 30; private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; /** *//** * 获得当前的监控对象. * @return 返回构造好的监控对象 * @throws Exception * @author */ public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; // 可使用内存 long totalMemory = Runtime.getRuntime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime.getRuntime().freeMemory() / kb; // 最大可使用内存 long maxMemory = Runtime.getRuntime().maxMemory() / kb; OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory .getOperatingSystemMXBean(); // 操作系统 String osName = System.getProperty("os.name"); // 总的物理内存 long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; // 剩余的物理内存 long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; // 已使用的物理内存 long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb .getFreePhysicalMemorySize()) / kb; // 获得线程总数 ThreadGroup parentThread; for (parentThread = Thread.currentThread().getThreadGroup(); parentThread .getParent() != null; parentThread = parentThread.getParent()) ; int totalThread = parentThread.activeCount(); double cpuRatio = 0; if (osName.toLowerCase().startsWith("windows")) { cpuRatio = this.getCpuRatioForWindows(); } // 构造返回对象 MonitorInfoBean infoBean = new MonitorInfoBean(); infoBean.setFreeMemory(freeMemory); infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize); infoBean.setMaxMemory(maxMemory); infoBean.setOsName(osName); infoBean.setTotalMemory(totalMemory); infoBean.setTotalMemorySize(totalMemorySize); infoBean.setTotalThread(totalThread); infoBean.setUsedMemory(usedMemory); infoBean.setCpuRatio(cpuRatio); return infoBean; } /** *//** * 获得CPU使用率. * @return 返回cpu使用率 * @author * Creation date: */ private double getCpuRatioForWindows() { try { String procCmd = System.getenv("windir") + "//system32//wbem//wmic.exe process get Caption,CommandLine," + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取进程信息 long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); if (c0 != null && c1 != null) { long idletime = c1[0] - c0[0]; long busytime = c1[1] - c0[1]; return Double.valueOf( PERCENT * (busytime) / (busytime + idletime)) .doubleValue(); } else { return 0.0; } } catch (Exception ex) { ex.printStackTrace(); return 0.0; } } /** *//** * 读取CPU信息. * @param proc * @return * @author * Creation */ private long[] readCpu(final Process proc) { long[] retn = new long[2]; try { proc.getOutputStream().close(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line = input.readLine(); if (line == null || line.length() < FAULTLENGTH) { return null; } int capidx = line.indexOf("Caption"); int cmdidx = line.indexOf("CommandLine"); int rocidx = line.indexOf("ReadOperationCount"); int umtidx = line.indexOf("UserModeTime"); int kmtidx = line.indexOf("KernelModeTime"); int wocidx = line.indexOf("WriteOperationCount"); long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < wocidx) { continue; } // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, // ThreadCount,UserModeTime,WriteOperation String caption = Bytes.substring(line, capidx, cmdidx - 1) .trim(); String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); if (cmd.indexOf("wmic.exe") >= 0) { continue; } // log.info("line="+line); if (caption.equals("System Idle Process") || caption.equals("System")) { idletime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); idletime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); continue; } kneltime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); usertime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } /** *//** * 测试方法. * @param args * @throws Exception * @author * Creation date: 2008-4-30 - 下午04:47:29 */ public static void main(String[] args) throws Exception { IMonitorService service = new MonitorServiceImpl(); MonitorInfoBean monitorInfo = service.getMonitorInfoBean(); System.out.println("cpu占有率=" + monitorInfo.getCpuRatio()); System.out.println("可使用内存=" + monitorInfo.getTotalMemory()); System.out.println("剩余内存=" + monitorInfo.getFreeMemory()); System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory()); System.out.println("操作系统=" + monitorInfo.getOsName()); System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb"); System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb"); System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb"); System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb"); } } package com.util; public class Bytes { /** *//** * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在 * 包含汉字的字符串时存在隐患,现调整如下: * @param src 要截取的字符串 * @param start_idx 开始坐标(包括该坐标) * @param end_idx 截止坐标(包括该坐标) * @return */ public static String substring(String src, int start_idx, int end_idx){ byte[] b = src.getBytes(); String tgt = ""; for(int i=start_idx; i<=end_idx; i++){ tgt +=(char)b[i]; } return tgt; } } package com.util; import java.io.FileInputStream; import java.io.InputStream; import java.sql.ResultSet; import java.util.Properties; import java.util.Timer; import java.util.TimerTask; import javax.servlet.ServletContextEvent; import com.component.database.CDataCn; import com.component.database.CDataImpl; /** * @author 作者: * @version 创建时间:Aug 6, 2009 1:12:24 PM * 类说明 */ public class JVMMonitor extends TimerTask { static String send_toemail=""; public void run() { try{ Properties propertie = new Properties(); FileInputStream in= new FileInputStream("D://sports//WEB-INF//classes//com//util//monitor.properties"); propertie.load(in); in.close(); send_toemail=propertie.getProperty("to_email"); }catch(Exception ex){ System.out.println(ex.toString()); } CDataCn dCn = null; CDataImpl dImpl = null; try{ dCn = new CDataCn(); dImpl = new CDataImpl(dCn); IMonitorService service = new MonitorServiceImpl(); MonitorInfoBean monitorInfo; double totalMemory=0;//可使用内存 double freeMemory=0;//剩余内存 monitorInfo = service.getMonitorInfoBean(); totalMemory=monitorInfo.getTotalMemory(); freeMemory=monitorInfo.getFreeMemory(); if(freeMemory<totalMemory*0.2){//当剩余内存小于20%时 StringBuffer sb=new StringBuffer("您好!<br>Tomcat现可用剩余内存已低于<font color='red'>20%</font>可用剩余内存为<font color='red'>"+freeMemory+"</font>,CPU占有率为<font color='red'>" + monitorInfo.getCpuRatio()+"%</font>,请您查看或联系相关人员!"); String sql="select * from (select buffer_gets, sql_text from v$sqlarea where buffer_gets > 50000 order by buffer_gets desc) where rownum<=5"; ResultSet rs=dImpl.executeQuery(sql); sb.append("<br>读写最频繁的语句:<br>"); int j=0; while(rs.next()) { j++; sb.append(j+":"+rs.getString("sql_text")+"<p>"); } rs.close(); sb.append("<br> 最消耗cpu的语句:<br>"); sql="select * from (select a.sid,spid,status,substr(a.program,1,40) prog,a.terminal,osuser,value/60/100 value from v$session a,v$process b,v$sesstat c where c.statistic#=12 and c.sid=a.sid and a.paddr=b.addr order by value desc ) where rownum<=5"; rs=dImpl.executeQuery(sql); String spid=""; while(rs.next()) { spid+=rs.getString("spid")+","; } rs.close(); String[] ArrSpid=spid.split(","); j=0; for(int i=0;i<ArrSpid.length;i++) { sql="select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.paddr=(select addr from v$process where spid="+ArrSpid[i]+")) "; rs=dImpl.executeQuery(sql); String sqlText1="", sqlText=""; while(rs.next()) { sqlText1+=rs.getString("sql_text")+"~"; } if(!"".equals(sqlText1)){ j++; String[] ArrSqlText=sqlText1.split("~"); for(int ii=ArrSqlText.length-1;ii>=0;ii--) { sqlText+=ArrSqlText[ii]+""; } rs.close(); sb.append(j+":"+sqlText+"<p>"); } } CMail sMail = new CMail("smtp.sina.com"); //新建Mail对象 String send_toemails[]=send_toemail.split(","); for(int i=0;i<send_toemails.length;i++){ send_toemail=send_toemails[i]; if(!send_toemail.equals("")){ //发送邮件操作 } } //String command = "C:RestartTomcat.exe";//执行bat重启tomcat命令 //Process proc = Runtime.getRuntime().exec(command); }else{ System.out.println("服务器正常,可使用内存为:"+freeMemory); } }catch(Exception testexp){ testexp.printStackTrace(); }finally{ //dImpl.closeSmtp(); dCn.closeCn(); System.gc(); } } public static void main(String[] args){ JVMMonitor jm=new JVMMonitor(); jm.run(); } }   

    monitor.properties

    to_email=*@gmail.com


    最新回复(0)