您的位置:首页 > 运维架构 > Tomcat

tomcat服务中内存相关的优化

2016-06-23 11:19 393 查看

启动参数

通过在tomcat的启动脚本catalina.sh中设置JAVA_OPTS或CATALINA_OPTS参数以实现tomcat内存的优化。常用参数见下表:

参数说明
-server设置启用jdk的server版。应用启动可能慢点,但能很大程度提高运行性能
-Xms设置JVM初始化时的内存大小
-Xmx设置JVM可使用的最大内存大小
-Xmn设置JVM最小内存大小,一般可以不设
-Xss设置每个线程stack的大小,stack的大小会影响线程的数量
-XX:PermSize设置内存永久保留区域的大小
-XX:MaxPermSize设置最大内存永久保留区域的大小
-XX:InitialCodeCacheSize设置初始代码缓存的大小
-XX:ReservedCodeCacheSize设置代码缓存的大小,如果代码缓存被占满,JVM将切换到interpreted-only模式:JIT编译器被停用,字节码将不再会被编译成机器码
-XX:+UseCodeCacheFlushing当代码缓存被填满时,让JVM放弃一些编译代码
-XX:OnOutOfMemoryError指定当内存溢出时执行一些指令,如发通知邮件或执行清理操作等,例:-XX:OnOutOfMemoryError=”sh ~/clean.sh”
-XX:+HeapDumpOnOutOfMemoryError让JVM在发生内存溢出时自动的生成堆内存快照,默认保存在JVM的启动目录下名为java_pid.hprof的文件里
-XX:HeapDumpPath指定当内存溢出时将堆内存快照写到的文件路径;堆内存快照文件可能很大,最好指定到一个有足够空间的地方

说明

1 堆内存

通常推荐将-Xms和-Xmx设置为相同大小。初始化的时候是按照-Xms的值来申请的内存大小,如果虚拟机启动时的内存较小,而应用程序在大负载情况下需要更多内存时,虚拟机就必须不断的增加内存来满足使用。因此,把-Xms和-Xmx设置为一样大小可以避免虚拟机重复的调整堆大小。如果堆大小设置太小,会报内存溢出的错误。另外,堆大小最大不要超多可用内存的80%。

2 永久保留区域

内存永久保留区域(Permanent Generation Space)主要是被JVM用来存放Class和Meta信息的。Class在被Loader时就会被放到PermGen Space中,它和存放类实例的Heap区域不同,垃圾收集(GC)不会在主程序运行期间对PermGen Space进行清理。

3 线程栈

线程stack大小通过-Xss来设置。stack太小会导致stack溢出,但stack太大,能够创建的线程数量将会受到限制,也可能导致内存溢出。其实,堆大小的设置也会影响线程数量的,因为可支持最大线程数=(可用内存-堆大小-Perm大小-)/Xss大小。

4 代码缓存

代码缓存(CodeCache)主要用于存放JIT所编译的代码。代码缓存区的大小在client模式下默认最大值为32m,在server模式下默认最大值为48m。这个值是可以设置,例如将其设置为80m可以使用:-XX:ReservedCodeCacheSize=80m

另外,需要注意的是,tomcat实际使用内存往往会超出JVM参数设置的值,不要惊慌。首先,JVM也是一个应用程序,自身运行也是需要消耗内存的。

后续想到了再补充。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tomcat jvm