设为首页 收藏本站
查看: 638|回复: 0

[经验分享] 查看TOMCAT内存使用情况(总结)

[复制链接]

尚未签到

发表于 2017-1-31 09:03:37 | 显示全部楼层 |阅读模式
  您可以用把下列代码放在一个JSP文件中,如写入memory.jsp,放到你的TOMCAT下的任何一应用中,就可以看到你的TOMCAT总大可使用多少内存,已经使用了多少.
  <%--
Document : memory
Created on : 2009-4-9, 1:35:17
Author : Administrator
--%>
  <%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JVM memory</title>
</head>
<body>
<%
double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024);
double max = (Runtime.getRuntime().maxMemory()) / (1024.0 * 1024);
double free = (Runtime.getRuntime().freeMemory()) / (1024.0 * 1024);
out.println("Java 虚拟机试图使用的最大内存量(当前JVM的最大可用内存)maxMemory(): " + max + "MB<br/>");
out.println("Java 虚拟机中的内存总量(当前JVM占用的内存总数)totalMemory(): " + total + "MB<br/>");
out.println("Java 虚拟机中的空闲内存量(当前JVM空闲内存)freeMemory(): " + free + "MB<br/>");
out.println("因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,<br/>" +
"而JVM实际可用内存并不等于freeMemory(),而应该等于 maxMemory()-totalMemory()+freeMemory()。<br/>");
out.println("JVM实际可用内存: " + (max - total + free) + "MB<br/>");
out.println("jspcn");
%>
</body>
  </html>
  

  上面的例子基本可以满足性能调试使用,下面的比较详细,需要开发代码,暂时使用上面简单例子。

  

  ---------------------------------------------------------
  同样也可以进入tomcat管理页面,查看内存使用情况,但是平常在生产环境都禁掉了管理员登录页面。
http://zhumeng8337797.blog.163.com/blog/static/10076891420129223928915/


   1. Tomcat6中没有设置任何默认用户,因而需要手动往Tomcat6conf文件夹下的tomcat-users.xml文件中添加用户。
   如:<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="manager"/>

   注:添加完需要重启Tomcat6
   2. 访问http://localhost:8080/manager/status,输入上面添加的用户名和密码。
   3. 然后在如下面的JVM下可以看到内存的使用情况。
JVM:Free memory: 2.50 MB Total memory: 15.53 MB Max memory: 63.56 MB
  Free memory:当前可用的内存;
  Total memory:当前已经分配的JVM内存;
   Max memory:当前允许分配的最大JVM内存;
  上周的题目有些简单,但是tomcat也需要我们研究一下,因为涉及的知识不多,但是将来这些都是部署时候非常有用的技术。

  

  -------------------------------------------------------
java不用jni,也可以获得当前系统性能信息
http://kakaluyi.iteye.com/blog/211492
  最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o...
  在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:
Java代码 DSC0000.png


  • packagecom.amgkaka.performance;

  • /***//**
  • *监视信息的JavaBean类.
  • *@authoramg
  • *@version1.0
  • *Creationdate:2008-4-25-上午10:37:00
  • */
  • publicclassMonitorInfoBean{
  • /***//**可使用内存.*/
  • privatelongtotalMemory;

  • /***//**剩余内存.*/
  • privatelongfreeMemory;

  • /***//**最大可使用内存.*/
  • privatelongmaxMemory;

  • /***//**操作系统.*/
  • privateStringosName;

  • /***//**总的物理内存.*/
  • privatelongtotalMemorySize;

  • /***//**剩余的物理内存.*/
  • privatelongfreePhysicalMemorySize;

  • /***//**已使用的物理内存.*/
  • privatelongusedMemory;

  • /***//**线程总数.*/
  • privateinttotalThread;

  • /***//**cpu使用率.*/
  • privatedoublecpuRatio;

  • publiclonggetFreeMemory(){
  • returnfreeMemory;
  • }

  • publicvoidsetFreeMemory(longfreeMemory){
  • this.freeMemory=freeMemory;
  • }

  • publiclonggetFreePhysicalMemorySize(){
  • returnfreePhysicalMemorySize;
  • }

  • publicvoidsetFreePhysicalMemorySize(longfreePhysicalMemorySize){
  • this.freePhysicalMemorySize=freePhysicalMemorySize;
  • }

  • publiclonggetMaxMemory(){
  • returnmaxMemory;
  • }

  • publicvoidsetMaxMemory(longmaxMemory){
  • this.maxMemory=maxMemory;
  • }

  • publicStringgetOsName(){
  • returnosName;
  • }

  • publicvoidsetOsName(StringosName){
  • this.osName=osName;
  • }

  • publiclonggetTotalMemory(){
  • returntotalMemory;
  • }

  • publicvoidsetTotalMemory(longtotalMemory){
  • this.totalMemory=totalMemory;
  • }

  • publiclonggetTotalMemorySize(){
  • returntotalMemorySize;
  • }

  • publicvoidsetTotalMemorySize(longtotalMemorySize){
  • this.totalMemorySize=totalMemorySize;
  • }

  • publicintgetTotalThread(){
  • returntotalThread;
  • }

  • publicvoidsetTotalThread(inttotalThread){
  • this.totalThread=totalThread;
  • }

  • publiclonggetUsedMemory(){
  • returnusedMemory;
  • }

  • publicvoidsetUsedMemory(longusedMemory){
  • this.usedMemory=usedMemory;
  • }

  • publicdoublegetCpuRatio(){
  • returncpuRatio;
  • }

  • publicvoidsetCpuRatio(doublecpuRatio){
  • this.cpuRatio=cpuRatio;
  • }
  • }

  接着编写一个获得当前的监控信息的接口,该类的代码如下所示:
Java代码


  • packagecom.amgkaka.performance;

  • /***//**
  • *获取系统信息的业务逻辑类接口.
  • *@authoramg*@version1.0
  • *Creationdate:2008-3-11-上午10:06:06
  • */
  • publicinterfaceIMonitorService{
  • /***//**
  • *获得当前的监控对象.
  • *@return返回构造好的监控对象
  • *@throwsException
  • *@authoramgkaka
  • *Creationdate:2008-4-25-上午10:45:08
  • */
  • publicMonitorInfoBeangetMonitorInfoBean()throwsException;

  • }

  该类的实现类MonitorServiceImpl如下所示:
Java代码


  • packagecom.amgkaka.performance;

  • importjava.io.InputStreamReader;
  • importjava.io.LineNumberReader;

  • importsun.management.ManagementFactory;

  • importcom.sun.management.OperatingSystemMXBean;

  • /***//**
  • *获取系统信息的业务逻辑实现类.
  • *@authoramg*@version1.0Creationdate:2008-3-11-上午10:06:06
  • */
  • publicclassMonitorServiceImplimplementsIMonitorService{
  • //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了
  • privatestaticfinalintCPUTIME=5000;

  • privatestaticfinalintPERCENT=100;

  • privatestaticfinalintFAULTLENGTH=10;

  • /***//**
  • *获得当前的监控对象.
  • *@return返回构造好的监控对象
  • *@throwsException
  • *@authoramg*Creationdate:2008-4-25-上午10:45:08
  • */
  • publicMonitorInfoBeangetMonitorInfoBean()throwsException{
  • intkb=1024;

  • //可使用内存
  • longtotalMemory=Runtime.getRuntime().totalMemory()/kb;
  • //剩余内存
  • longfreeMemory=Runtime.getRuntime().freeMemory()/kb;
  • //最大可使用内存
  • longmaxMemory=Runtime.getRuntime().maxMemory()/kb;

  • OperatingSystemMXBeanosmxb=(OperatingSystemMXBean)ManagementFactory
  • .getOperatingSystemMXBean();

  • //操作系统
  • StringosName=System.getProperty("os.name");
  • //总的物理内存
  • longtotalMemorySize=osmxb.getTotalPhysicalMemorySize()/kb;
  • //剩余的物理内存
  • longfreePhysicalMemorySize=osmxb.getFreePhysicalMemorySize()/kb;
  • //已使用的物理内存
  • longusedMemory=(osmxb.getTotalPhysicalMemorySize()-osmxb
  • .getFreePhysicalMemorySize())
  • /kb;

  • //获得线程总数
  • ThreadGroupparentThread;
  • for(parentThread=Thread.currentThread().getThreadGroup();parentThread
  • .getParent()!=null;parentThread=parentThread.getParent())
  • ;
  • inttotalThread=parentThread.activeCount();

  • doublecpuRatio=0;
  • if(osName.toLowerCase().startsWith("windows")){
  • cpuRatio=this.getCpuRatioForWindows();
  • }

  • //构造返回对象
  • MonitorInfoBeaninfoBean=newMonitorInfoBean();
  • 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);
  • returninfoBean;
  • }

  • /***//**
  • *获得CPU使用率.
  • *@return返回cpu使用率
  • *@authoramg*Creationdate:2008-4-25-下午06:05:11
  • */
  • privatedoublegetCpuRatioForWindows(){
  • try{
  • StringprocCmd=System.getenv("windir")
  • +"\\system32\\wbem\\wmic.exeprocessgetCaption,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){
  • longidletime=c1[0]-c0[0];
  • longbusytime=c1[1]-c0[1];
  • returnDouble.valueOf(
  • PERCENT*(busytime)/(busytime+idletime))
  • .doubleValue();
  • }else{
  • return0.0;
  • }
  • }catch(Exceptionex){
  • ex.printStackTrace();
  • return0.0;
  • }
  • }

  • /***//**
  • *读取CPU信息.
  • *@paramproc
  • *@return
  • *@authoramg*Creationdate:2008-4-25-下午06:10:14
  • */
  • privatelong[]readCpu(finalProcessproc){
  • long[]retn=newlong[2];
  • try{
  • proc.getOutputStream().close();
  • InputStreamReaderir=newInputStreamReader(proc.getInputStream());
  • LineNumberReaderinput=newLineNumberReader(ir);
  • Stringline=input.readLine();
  • if(line==null||line.length()<FAULTLENGTH){
  • returnnull;
  • }
  • intcapidx=line.indexOf("Caption");
  • intcmdidx=line.indexOf("CommandLine");
  • introcidx=line.indexOf("ReadOperationCount");
  • intumtidx=line.indexOf("UserModeTime");
  • intkmtidx=line.indexOf("KernelModeTime");
  • intwocidx=line.indexOf("WriteOperationCount");
  • longidletime=0;
  • longkneltime=0;
  • longusertime=0;
  • while((line=input.readLine())!=null){
  • if(line.length()<wocidx){
  • continue;
  • }
  • //字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
  • //ThreadCount,UserModeTime,WriteOperation
  • Stringcaption=Bytes.substring(line,capidx,cmdidx-1)
  • .trim();
  • Stringcmd=Bytes.substring(line,cmdidx,kmtidx-1).trim();
  • if(cmd.indexOf("wmic.exe")>=0){
  • continue;
  • }
  • //log.info("line="+line);
  • if(caption.equals("SystemIdleProcess")
  • ||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;
  • returnretn;
  • }catch(Exceptionex){
  • ex.printStackTrace();
  • }finally{
  • try{
  • proc.getInputStream().close();
  • }catch(Exceptione){
  • e.printStackTrace();
  • }
  • }
  • returnnull;
  • }

  • /***//**
  • *测试方法.
  • *@paramargs
  • *@throwsException
  • *@authoramg*Creationdate:2008-4-30-下午04:47:29
  • */
  • publicstaticvoidmain(String[]args)throwsException{
  • IMonitorServiceservice=newMonitorServiceImpl();
  • MonitorInfoBeanmonitorInfo=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");
  • }
  • }

  该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:
Java代码


  • packagecom.amgkaka.performance;

  • /***//**
  • *byte操作类.
  • *@authoramg*@version1.0
  • *Creationdate:2008-4-30-下午04:57:23
  • */
  • publicclassBytes{
  • /***//**
  • *由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在
  • *包含汉字的字符串时存在隐患,现调整如下:
  • *@paramsrc要截取的字符串
  • *@paramstart_idx开始坐标(包括该坐标)
  • *@paramend_idx截止坐标(包括该坐标)
  • *@return
  • */
  • publicstaticStringsubstring(Stringsrc,intstart_idx,intend_idx){
  • byte[]b=src.getBytes();
  • Stringtgt="";
  • for(inti=start_idx;i<=end_idx;i++){
  • tgt+=(char)b;
  • }
  • returntgt;
  • }
  • }

  运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-335566-1-1.html 上篇帖子: red5 整合到tomcat中(一) 下篇帖子: 停止Tomcat webapp报错的尝试解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表