异常500,程序异常,Exception
当前位置:Exception500 » 其他架构 » 常见的JAVA虚拟机JVM错误配置及优化原则

常见的JAVA虚拟机JVM错误配置及优化原则

来源:exception500.com    发布时间:2020-02-14 10-54-42    浏览次数:1035次

简介:VM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

一、常见JVM错误:

1、Caused by: java.lang.OutOfMemoryError: PermGen space

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。这块内存主要是被JVM存放Class和Meta信息的。 
Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同。 
GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误, 
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。


2、java.lang.OutOfMemoryError: Java heap space

JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。

Heap size 的大小是Young Generation 和Tenured Generaion 之和。JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。

Heap Size 最大不要超过可用物理内存的80%

一般的要将-Xms和-Xmx选项设置为相同(java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源)。而-Xmn(设置年轻代大小)为1/4的-Xmx值。


“推荐Xms和Xmx设置值为相同”,并不适用于所有情况,要根据实际情况而定。 当服务器多个tomcat同时运行时,(Xms要肯定小于Xmx)建议每个tomcat 设置 Xms = 1/2Xmx或2/3Xmx。理由是当某个tomcat高峰时,可以弹性分配内存空间。无可避免以上重新分配分隔内存的效率问题。


二、JVM信息查看命令:

查看JDK路径:

[root@iZ25bzw04lpZ /]# whereis java

[root@iZ25bzw04lpZ /]# echo $JAVA_HOME

[root@iZ25bzw04lpZ /]# which java

[root@iZ25bzw04lpZ /]# echo $PATH

查看java进程:

bin/jps –v

JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。

查看JVM的GC情况:

bin/jstat  -gcutil  1566  3000 5  「pid 1566 3秒1次 执行5次」

S0     S1     E      O      M     CCS    YGC     YGCT    FGC   

S0 -Heap上的Survivor space 0区已使用空间的百分比

S1 -Heap上的Survivor space 1区已使用空间的百分比

E -Heap上Eden space区已使用空间的百分比

O -Heap上的Old space区已使用空间的百分比,达到100%,就是内存溢出了

P -Perm space区已使用空间的百分比,达到100%,就是内存溢出了

YGC -从应用程序启动到采样时发生Yang GC 的次数

YGCT -从应用程序启动到采样时Yang GC所用的时间【单位秒】

FGC -从应用程序启动到采样时Full GC的次数

FGCT -从应用程序启动到采样时Full GC所用的时间

GCT -从应用程序启动到采样时用于垃圾回收的总时间【单位秒】

通过监控O、P数值情况,再次调整JAVA_OPTS相关参数大小达到优化目的。

在这里说明一下jdk1.7和jdk1.8的内存模型变化。我们知道在Hotspot虚拟机上,通过永久代来实现方法区,jdk1.8去永久代之后,使用元空间实现方法区。在jdk1.7的环境下执行jstat时,使用P来代表永久代,即方法区的内存占用率,而jdk1.8显示的是M,代表方法区。

查看jvm配置:

bin/jinfo 1566

jmap:java内存映像工具:

bin/jmap 1566

bin/jmap -heap 1566

jstack:Java堆栈跟踪工具:

bin/jstack 1566


三、常见配置汇总

    堆设置

        -Xms:初始堆大小

        -Xmx:最大堆大小

        -XX:NewSize=n:设置年轻代大小

        -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

        -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

        -XX:MaxPermSize=n:设置持久代大小

    收集器设置

        -XX:+UseSerialGC:设置串行收集器

        -XX:+UseParallelGC:设置并行收集器

        -XX:+UseParalledlOldGC:设置并行年老代收集器

        -XX:+UseConcMarkSweepGC:设置并发收集器

    垃圾回收统计信息

        -XX:+PrintGC

        -XX:+PrintGCDetails

        -XX:+PrintGCTimeStamps

        -Xloggc:filename

    并行收集器设置

        -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

        -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

        -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

    并发收集器设置

        -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

        -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。



[关键词: JAVAJVMJDK ]

软件开发 程序错误 异常 500错误 Exception Copyright© 2019-2021  Exception500 版权所有  【蜀ICP备15020376号-9】  网站地图