linux下用ps -aux可以监控java的进程情况。
linux根据内核的不同对每个进程分配的最大使用内存不同,如果是32位机器,cpu最大的寻址空间是2的32次方,4G,但内核分配给每个进程最大的内存肯定是小于4G,经过重新编译的内核分配给java进程的最大内存是2G,如果tomcat中的catalina.sh中的java-opts Xms1024m -Xmx1600,那么你就要小心了,根据tomcat指南中介绍,tomcat的请求和响应是通过线程池这种异步通信机制来完成的,而每个线程除了JVM会给它分配堆栈外,还要占用操作系统的一些内存资源,当然没有固定大小,原因是线程可以共享进程的内存资源。如果jvm是1.6G,线程数达到一定的数量,即访问量不断增大的时候,线程一共占用操作系统的内存资源超过400M,那么一个java进程就很可能操作2G的限制,导致无法正常提供服务。
其实,java进程的内存的实际使用达不到2G,这里指的是java进程的虚拟内存。我们可以用ps -aux很好的观察到,VSZ字段就是虚拟内存的使用量,指的是将整个进程一次装入到内存里所需要的内存大小,RSS字段是进程实际使用内存的大小。根据刚才的分析,对VSZ字段的监控可以很好的起到报警预防作用。当然为了保证服务的稳定与快捷,还是应该合理的调整java-opts 的参数。
关于JVM的内存管理方面,可以参考以下文章:
另外还有一篇文章,关于如何获得JVM的最大可用内存。http://cmm.iteye.com/blog/699949
在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。
错误显示如下:
[root@ngtsl68 bin]# java -Xmx2700M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
正确显示如下:
[root@ngtsl68 bin]# java -Xmx2600M -version
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Server VM (build 16.0-b13, mixed mode)
阅读(3618) | 评论(0) | 转发(0) |