蚩尤后裔 2015-02-02
作为一个开发人员,肯定经常碰到这两种错误,PermGen Space, Out of Memory 的错误,那么他们是怎么导致的呢?
(一)PermGen space 【常见在web服务器对JSP进行pre compile的时候】
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也一定是加大内存。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m,当然大小根据实际情况调整。 如果是在tomcat ,手动设置MaxPermSize大小。修改TOMCAT_HOME/bin/catalina.sh 在 echo "Using CATALINA_BASE: $CATALINA_BASE" 上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
(二)java.lang.OutOfMemoryError: Java heap space Heap size 设置 JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。提示:Heap Size 最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:手动设置Heap size 修改TOMCAT_HOME/bin/catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -Xms512m -Xmx512m -XX:MaxNewSize=256m"
原文地址:http://blog.csdn.net/fengyie007/article/details/1780375
上面网址里面有个评论写的也很好:启动了JDK自带的工具,在\jdk1.6.0_10\bin下面的jconsole.exe内存监控的工具,点击进入如下:选择PID为4472的这个进程,点击 ,进入如下界面 【图片略,点击不同的内存块的时候,一定要等几秒钟jconsole 视图才会刷新,切记!!!】
选择内存页,并且选择图表中最后一个选项的“内存池“Perm Gen”,下面的详细信息显示的是:
这个地方的最大值是65536Kb,也就是64M,我于是就找到原因了,64M肯定会导致溢出,但是我配置了几百兆的内存空间就是不生效呢。注意,这个是我在myclipse中启动的tomcat看到的结果。
接下来,我进入bin/catalina.bat文件中的“rem ----- Execute The Requested Command -”这个后面增加了下面的语句set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=512m,这个地方注意增加的位置是在rem ----- Execute The Requested Command –后面,最好set JAVA_OPTS=%JAVA_OPTS% 这个也要加上,这个网络上好多文档没有将这个位置交代清楚,或者说的不是这个地方,是不是其他地方也可以,我没有试。我手工启动tomcat,在cmd状态下输入:startup,然后看jconsole.exe,明细Perm Gen的内存就是我配置的内存521M,是生效了的.
但是我在myclipse中启动tomcat后,重新部署程序,错误依旧。原来文档《Linux 和 Windows修改Java虚拟机内存大小》(http://duanfei.iteye.com/blog/1189541)中提到
如果是通过Myeclipse启动Tomcat修改
Myeclipse配置选项 打开选项..输入tomcat关键字,然后点开Server下面的JDK就会出现配置区域Optional Java VM arguments.
直接加入 -Xms128m -Xmx512m
这个地方是有一个漏洞的,直接加入 “-Xms128m -Xmx512m ”,应该是“ -Xms256m -Xmx512m -XX:PermSize=256m -XX:MaxPermSize=512m”,这个是对myclipse生效的。如果没有-XX:PermSize=256m -XX:MaxPermSize=512m,那么PermGen的内存始终是64M。修改后,重启tomcat,重新部署,内存不再溢出了。
我的机器上是:Servers/Tomcat/Tomcat 6.x/JDK 中的Optional Java VM arguments:
找到了原因,解决也就自然很简单了。
注意这个地方Servers/Tomcat/Tomcat 6.x 这个地方还有一个参数:Optional program arguments,这个感觉作用不大,我也是修改后没有什么效果,我以为修改这个地方就可以了,导致我走了弯路。
设置eclipse集成tomcat的debug JVM内存信息
1)依次打开eclipse中的Run ==> Run(Debug) Configurations/Arguments,在VM arguments一栏中的末尾加上:-Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=512m 如图:
============================================================================
另外两个问题TPS,QPS,以及磁盘的IOPS ,参考如下两个地址
理论上可以计算出磁盘的平均最大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略数据传输时间。假设磁盘平均物理寻道时间为3ms, 磁盘转速为7200,10K,15K rpm,则磁盘IOPS理论最大值分别为,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200
1000 是 1秒=1000毫秒,3ms是 磁盘寻道时间,7200 rpm的磁盘平均旋转延迟大约为60*1000/7200/2 = 4.17ms,数据传输时间远小于这两者,一般忽略。
实际测量中,IOPS数值会受到很多因素的影响,包括I/O负载特征(读写比例,顺序和随机,工作线程数,队列深度,数据记录大小)、系统配置、操作系统、磁盘驱动等等。
维基百科地址:http://en.wikipedia.org/wiki/IOPS
(二) http://blog.itpub.net/22664653/viewspace-767265/
总结:
Questions 是记录了从mysqld启动以来所有的select,dml 次数包括show 命令的查询的次数。这样多少有失准确性,比如很多数据库有监控系统在运行,每5秒对数据库进行一次show 查询来获取当前数据库的状态,而这些查询就被记录到QPS,TPS统计中,造成一定的"数据污染".
如果数据库中存在比较多的myisam表,则计算还是questions 比较合适。
如果数据库中存在比较多的innodb表,则计算以com_*数据来源比较合适。