启动参数
通过在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也是一个应用程序,自身运行也是需要消耗内存的。
后续想到了再补充。。。