JAVA内存问题。

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里面部署多个程序,应该就相当于一个虚拟机里面有多个程序运行吧。。这几个程序共享一个虚拟机。那么有什么办法获取一个程序的当前占用的内存吗?

[quote]5: 一个tomcat里面部署多个程序,应该就相当于一个虚拟机里面有多个程序运行吧。。这几个程序共享一个虚拟机。那么有什么办法获取一个程序的当前占用的内存吗? [/quote]

一个tomcat运行的时候是一个进程,不同的应用程序是由不同的线程来运行,tomcat内部把它们隔开了,但实际还是在同一个jvm,我不知有什么方法可以获得各个程序占用的内存,如果有估计也需要tomcat来提供。

我觉得你不理解的主要是windows中任务管理器显示的内存。

一般显示windows任务管理器显示的是真实内存,应用程序申请到的内存其实是虚拟内存,也就是如果设置了java的内存参数 -Xms512M -Xmx512M,你会看到这个进程点用了512M 的虚拟内存。

windows查看虚拟内存的方法:打开任务管理器,查看,选择列,勾选“虚拟内存大小”。

[quote]我要问的是 JAVA虚拟机最大的堆内存设置为512M,那么现在其实只用了80M,当不够的时候,虚拟机要像系统申请,这个时候如果系统没有足够的内存给JAVA虚拟机用,是否就会出错。。 [/quote]
jvm也是一个程序,它要向操作系统申请内存,如果操作系统的内存不足,会拒绝之,当然会出错。

直接用jconsole查看啊,很简单的

换个角度,单起一个应用,就可以测一个应用使用的内存了

另外,如果你想测试某个部分占用内存情况,用freeMemory是不行的,可以用Sizeof这个包