我正在做我的Java Web应用程序的内存pipe理分析,
在启动我的tomcat之前,可用内存大约是595 MB,一旦启动服务器,可用内存就达到151 MB。 当我拿起堆转储时,对象占用了262 MB。
那么单独的tomcat会剩下181 MB吗?
另一个问题是,我用500个用户运行负载testing。 空闲的内存到8MB,当我在这里采取堆转储,大约是265MB。 所以自由空间151MB减less到8MB,可能是什么原因
首先,阅读并理解http://www.linuxatemyram.com/为什么“免费”的内存数量比你想象的要低得多。
其次,Java在操作系统中预先分配了整个堆,尽pipe在实际使用之前它不会触摸或弄脏页面。 这给你最好的输出,如:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 9521 pjc 17 0 1288m 524m 25m S 0.0 13.3 58:31.92 java
这是我运行Eclipse; VIRT列显示Java可能具有1024Mb的最大堆大小; 最重要的是分配用于存储编译的Java的库和内存。 但目前只有524Mb在RAM中。
您的堆转储是您的应用程序使用多less内存的最佳指南 – 只要在完成垃圾收集之后。
操作系统很聪明,不笨。 它理解空闲内存浪费了内存,并不比完全不在系统中的内存更好。 这不像是你的4GB机器今天只用3GB,明天你可以用5GB。
所以它保留了可以在RAM中使用的东西。 如果以后能够使用它,这是一个performance胜利。 令人惊讶的是,如果以后不能使用它,它仍然是一个performance胜利,因为如果它已经释放,它将不得不再次使用它。 (这将需要两个操作,而直接从一个用户切换到另一个只是一个操作。)
现代操作系统只有less量的内存空闲,只有当他们没有select。
使用psi-probe来实际了解JVM中发生了什么。 或VisualVM,但psi探针更容易访问。