系统应用一般我们要做性能监控,不用其他的开源工具,其实JDK本身就自带了一个非常好用的东东。
jconsole是JDK5开始自带的基于GUI的JVM监控工具,可以监控内存、线程、jvm堆栈、执行GC等,不仅可以对本机JVM进行监控,也可用于远程主机的JVM。
首先,配置jboss启动参数,jboss4.2x中,可以打开run.bat文件。
-Djava.rmi.server.hostname=10.5.35.151 设置访问的主机地址
-Dcom.sun.management.jmxremote.port=8950 设置端口
-Dcom.sun.management.jmxremote.authenticate=false 不需要认证
-Dcom.sun.management.jmxremote.ssl=false 不需要SSL
如果需要设置用户名和密码,
则 -Dcom.sun.management.jmxremote.authenticate=true
同时还要设置密码文件
-Dcom.sun.management.jmxremote.password.file=$JAVA_HOME/jre/lib/management/jmxremote.password
在jmxremote.password文件中增加用户名密码即可。
然后双击run.bat , 启动jboss.
cmd-> jconsole 10.128.115.5:8950或
找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole
这里有六个tab页,分别对内存、线程、类等都有监控,非常方便。
一般情况下,我们会使用这种方式观察内存使用情况,线程是否有死锁等等。
--------------------------------------------------------------------------------------------------------------------------------------------------------
内存溢出
引起内存溢出的原因有很多种,常见的有以下几种:
l 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
l 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
l 代码中存在死循环或循环产生过多重复的对象实体;
l 使用的第三方软件中的BUG;
l 启动参数内存值设定的过小;
内存溢出类型
1 、 java.lang.OutOfMemoryError: PermGen space
JVM 管理两种类型的内存,堆和非堆。堆是给开发人员用的上面说的就是,是在 JVM 启动时创建;非堆是留给 JVM 自己用的,用来存放类的信息的。它和堆不同,运行期内 GC 不会释放空间。如果 web app 用了大量的第三方 jar 或者应用有太多的 class 文件而恰好 MaxPermSize 设置较小,超出了也会导致这块内存的占用过多造成溢出,或者 tomcat 热部署时侯不会清理前面加载的环境,只会将 context 更改为新部署的,非堆存的内容就会越来越多。
2 、 java.lang.OutOfMemoryError: Java heap space
第一种情况是个补充,主要存在问题就是出现在这个情况中。其默认空间 ( 即 -Xms) 是物理内存的 1/64 ,最大空间 (-Xmx) 是物理内存的 1/4 。如果内存剩余不到 40 %, JVM 就会增大堆到 Xmx 设置的值,内存剩余超过 70 %, JVM 就会减小堆到 Xms 设置的值。所以服务器的 Xmx 和 Xms 设置一般应该设置相同避免每次 GC 后都要调整虚拟机堆的大小。假设物理内存无限大,那么 JVM 内存的最大值跟操作系统有关,一般 32 位机是 1.5g 到 3g 之间,而 64 位的就不会有限制了。
注意:如果 Xms 超过了 Xmx 值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收 GC 的角色
JVM 调用 GC 的频度还是很高的,主要两种情况下进行垃圾回收:
当应用程序线程空闲;另一个是 java 内存堆不足时,会不断调用 GC ,若连续回收都解决不了内存堆不足的问题时,就会报 out of memory 错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据 GC 的机制,程序的运行会引起系统运行环境的变化,增加 GC 的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和 GC 的开销。显示调用 System.GC() 只能建议 JVM 需要在内存中对垃圾对象进行回收,但不是必须马上回收,
一个是并不能解决内存资源耗空的局面,另外也会增加 GC 的消耗。
JVM如何设置虚拟内存windows 版本:
修改 run.bat
1g内存的配置 是其物理内存80%
set JAVA_OPTS=" -Xms800m -Xmx800m -Xmn256m -Xss128k"
linux 版本:
修改 run.conf文件
1g 内存的配置 是其物理内存25%
JAVA_OPTS="-server -Xms256m -Xmx256m -Xmn80m -XX:PermSize=64m -XX:MaxPermSize=128m -Xss128k"
提示:注意:如果 Xms超过了 Xmx值,或者堆最大值和非堆最大值的总和超过了物理内 存或者操作系统的最大限制都会引起服务器启动不起来。
提示:设置 NewSize、 MaxNewSize相等, “new”的大小最好不要大于 “old”的一半,原因是 old区如果不够大会频繁的触发 “主 ” GC ,大大降低了性能
JVM使用 -XX:PermSize设置非堆内存初始值,默认是物理内存的 1/64;
由 XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的 1/4。