日期:2014-05-16  浏览次数:20780 次

Linux下安装Oracle JRockit Mission Control 4.0
最近tomcat6, SSH项目执行一段时间后会发生outofmemory, permanent heap溢出 , 然后没有反应,必须重启才可以。

引用一段:
发现很多人把问题归因于: spring,hibernate,tomcat,因为他们动态产生类,导致JVM中的permanent heap溢出 。然后解决方法众说纷纭,有人说升级 tomcat版本到最新甚至干脆不用tomcat。还有人怀疑spring的问题,在spring论坛上讨论很激烈,因为spring在AOP时使用CBLIB会动态产生很多类。

但问题是为什么这些王牌的开源会出现同一个问题呢,那么是不是更基础的原因呢?tomcat在Q&A很隐晦的回答了这一点,我们知道这个问题,但这个问题是由一个更基础的问题产生。

于是有人对更基础的JVM做了检查,发现了问题的关键。原来SUN 的JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但他没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,gc根本没办法回收!

2003年的时候就有一个bug报告给sun,但是到现在,这个bug还没有close!有人在这个bug加了句评语:“A bug this critical is open since 2003? Absolutely shameful.” 我觉得SUN在这个BUG上确实有些丢脸。


参考了:http://www.iteye.com/topic/5322,于是想试试JRockit

安装Oracle JRockit Mission Control 4.0看看情况怎么样,

首先判断是32位还是64位系统,通过命令
打入下面的命令
       grep flags /proc/cpuinfo

       输出
       flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush     dts acpi mmx fxsr sse sse2 ss ht tm nx lm

      如果找到lm, 则说明你的CPU是64位的. lm是long mode的意思.

      Long Mode - 64位CPU
      Real Mode - 16位CPU
      Protected Mode - 32位CPU

        uname -a
        输出1
       Linux test-1 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:12 EDT 2008 i686 
       i386, i686说明你是32位的内核, 跑的是32位的系统.
   eg: Linux localhost.localdomain 2.6.18-128.el5PAE #1 SMP Wed Jan 21 11:19:46 EST 2009 i686 i686 i386 GNU/Linux

        输出2
       Linux test-2 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 
       x86_64则说明你是64位内核, 跑的是64位的系统.

       如果你cpuinfo的输出有lm标志, 而uname -a命令的输出是i386或i686, 说明你是64位的CPU跑的32位的系统.

根据不同类型下载不同的文件,


接着安装 
我下的是:jrmc-4.0.0-1.6.0-linux-ia32.bin
执行以下命令将文件设为可执行
chmod 777 jrmc-4.0.0-1.6.0-linux-ia32.bin
然后
./jrmc-4.0.0-1.6.0-linux-ia32.bin

发现输出:bin Text file busy,估计有其它进程在使用,执行:
fuser -k jrmc-4.0.0-1.6.0-linux-ia32.bin
杀掉其它进程
重新执行:
./jrmc-4.0.0-1.6.0-linux-ia32.bin
一路NEXT,完成


配置环境:
在/etc/profile里最后写入如下:
#vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.6.0_16
export JRE_HOME=/usr/java/jdk1.6.0_16/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export SVN_HOME=/usr/svn/subversion1.6.5
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$SVN_HOME/bin:$PATH

使环境变量生效:
source /etc/profile
java -version

结果:
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Oracle JRockit(R) (build R28.0.0-679-130297-1.6.0_17-20100312-2128-linux-ia32, compiled mode)
说明安装成功。

最后配置tomcat, 因为之前使用SUN JDK,曾经在catalina.sh配置了一些启动参数:
-Xmn800m
-XX:+UseConcMarkSweepGC
-XX:MaxTenuringThreshold=8 
-XX:+ExplicitGCInvokesConcurrent

这些与JRockit有冲突,直接删除,重新启动tomcat, 成功!


接下来会使用测试工具对性能测试一下
http://www.volano.com/benchmarks.html

1 楼 tuhaitao 2010-11-11  
很希望看到测试结果