问题描述
JDK版本:1.6.0_19服务器:tomcat测试项目:一个简单的web程序。里面有个systemInfo.jsp页面。,调用了Runtime的totalMemory(),maxMemory(),freeMemory() 以及当前使用的内存totalMemory()-freeMemory(),CPU核数availableProcessors() 测试目的:查看JSP打出来的内存大小和任务管理器里面的JAVA进程的大小是否一样。详情: 1:以前一直没注意,这几天突然发现windows的任务管理器 里面的内存和程序真正运行的时候是不一样的。当时就迷惑了。JAVA启动后就是一个JAVA进程,我们都知道,里面包含了JAVA虚拟机还有一些其他的东西。所以任务管理器里面的内存要比我们用程序查看的时候大,因为程序里面只显示的是JAVA虚拟机的内存。这是我的理解。不知对否。 2:为什么我程序里面调用runtime.maxMemory()打印出来的最大内存数是519m(519.....K),而我设置的-Xmx是512M,好像有3M不见了。我认为可能是虚拟机不会准确的去抓去512M,只能在512M左右,不知这样理解对否。 3:让我郁闷的就是:如我前面所说,我的内存最大设置了512M,初始化内存是64M。所以totalMemory()这里的内存打出来差不多也是64M,但是任务管理器里面的JAVA内存大小是89M(程序运行5分钟),89M比我们JAVA虚拟机的内存多了25M的样子,这25M可能是TOMCAT启动后,其他东西的使用。但是和我开始想的不一样。我认为JAVA这个进程应该是512M才对,不然JAVA怎么保证他的最大内存可使用呢?如果其他程序把内存耗尽,那么这个时候JAVA虚拟机要向内存再申请的时候,就不是申请不了了吗? 4:有谁告诉一下如何用JAVA查看某个进程(不一定是JAVA的进程,比如查看QQ的进程)的内存使用情况。 5: 一个tomcat里面部署多个程序,应该就相当于一个虚拟机里面有多个程序运行吧。。这几个程序共享一个虚拟机。那么有什么办法获取一个程序的当前占用的内存吗? 问题补充:langshao 写道
解决方案
引用5: 一个tomcat里面部署多个程序,应该就相当于一个虚拟机里面有多个程序运行吧。。这几个程序共享一个虚拟机。那么有什么办法获取一个程序的当前占用的内存吗? 一个tomcat运行的时候是一个进程,不同的应用程序是由不同的线程来运行,tomcat内部把它们隔开了,但实际还是在同一个jvm,我不知有什么方法可以获得各个程序占用的内存,如果有估计也需要tomcat来提供。
解决方案二:
换个角度,单起一个应用,就可以测一个应用使用的内存了另外,如果你想测试某个部分占用内存情况,用freeMemory是不行的,可以用Sizeof这个包
解决方案三:
直接用jconsole查看啊,很简单的
解决方案四:
引用我要问的是 JAVA虚拟机最大的堆内存设置为512M,那么现在其实只用了80M,当不够的时候,虚拟机要像系统申请,这个时候如果系统没有足够的内存给JAVA虚拟机用,是否就会出错。。 jvm也是一个程序,它要向操作系统申请内存,如果操作系统的内存不足,会拒绝之,当然会出错。
解决方案五:
我觉得你不理解的主要是windows中任务管理器显示的内存。一般显示windows任务管理器显示的是真实内存,应用程序申请到的内存其实是虚拟内存,也就是如果设置了java的内存参数 -Xms512M -Xmx512M,你会看到这个进程点用了512M 的虚拟内存。windows查看虚拟内存的方法:打开任务管理器,查看,选择列,勾选“虚拟内存大小”。