2019.9.25 Tomcat JVM参数优化
JVM参数的优化 JVM 是java虚拟机,是jdk最底层的东西
适当调整tomcat的运行jvm参数可以提升整体性能,和内存使用率。
JVM内存模型
Java栈
Java栈与每一个线程关联的,jvm在创建每个线程的时候,会分配一定的栈空间给线程使用,它主要用来存储线程执行过程中的局部变量,和方法的返回值,以及方法调用上下文,栈空间随着线程的终止而释放。
Java堆
Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种java对象,比如数组,线程对象等。
Java堆的分区
Young新生代
新生成的对象都是放在新生代的。新生代的目标就是尽可能快速的回收掉那些生命周期短的对象 。
新生代分为三个区:一个Eden区,两个Survivor区(一般情况)。大部分对象是在Eden区中生成,某一个时刻只有其中一个是被使用的,当Eden区满了,GC就会将存活的对象移到空闲的survivor区间中,根据jvm的策略。在经过几次垃圾收集后,任然存活于survivor的对象将被移动到oid generation区间。
(新生成的对象都在新生代,java的GC会进行垃圾回收你这个对象,但是它发现你这个内存对象还在应用,根据几次的垃圾回收,任然还有些对象没有被回收的话就给他放到老年代里,放到老年代里不一定不会被GC回收)。
Oid Generation老年代
Oidgeneration区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移到一定次数以后,内存对象就会被转移到oidgeneration区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间,放到老年代里不一定不会被GC回收。
Perm永久代
Perm主要保存class,method,filed对象,并不会被GC回收。
Virtual区:
最大内存和初始内存的差值,就是virtual区,年轻代,老年代,永久代上都有虚拟区(virtual)
设置区的大小
Jvm提供了相应的参数来对内存大小进行配置,jvm中堆被分为了3个大的区间,同时jvm也提供了一些选项对young,oidgeneration的大小进行控制
Total heap
l -Xms:指定了jvm初始启动以后初始化内存
l -Xmx:指定jvm堆的最大内存,在jvm启动以后,会分配-Xmx参数指定大小的内存给JVM,但是不一定全都使用,jvm会根据-Xms参数来调节真正用于jvm的内存
l Xmx-Xms=virtual大小(之差就是三个virtual空间大小)
年轻代:
l -XX:NewRatio=8意味着oidgeneration和young的比值8:1,这样eden+2*survivr=1/9堆内存
l -XX:SurvivorRatio=32意味着eden和一个survivor的比值是32:1,这样一个Survivorj就占young区的1/34
l -Xmn参数设置了年轻代的大小
永久代:
l -XX:PermSize=16M –XX:MaxPermSize=64M
Thread Stack
l -XX:Xss=128k
常用参数
参数说明:
file.encoding 默认文件编码
–Xmx1024m 设置JVM最大可用内存为1024MB
–Xms1024m 设置JVM最小内存为1024m,此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存
–XX:NewSize 设置年轻代
XX:MaxNewSize 设置最大的年轻代大小
–XX:PermSize 设置永久代大小
–XX:MaxPermSize 设置最大永久代大小
–XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5
–XX:MaxTenuringThreshold=0: 设置垃圾最大年龄,默认为15,如果设置为0的话,则年轻代对象不经过Survivor区,直接进去老年代,对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加再年轻代即被回收的概论。
–XX:+DisableExplicitGC 这个将会忽略手动调用GC的代码使得System.gc()的调用就会变成一个空调用,完全不会出发任何GC
在tomcat中设置JVM参数
Tomcat性能取决于内存大小
- 上策:优化代码
该项需要开发经验足够丰富,对开发人员要求较高
- 中策:jvm优化机制 垃圾回收机制 把不需要的内存回收
优化jvm--优化垃圾回收策略
- 下策:加足够大的内存
该项的资金投入较大
- 下下策:每天0点定时重启tomcat
使用较为广泛
[root@node1 ~]# cd /usr/local/tomcat7/webapps/
[root@node1 webapps]# rz
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
# tomcat分配1G内存模板
[root@localhost ~]# vim /usr/local/tomcat8/bin/catalina.sh //-Xms1024 这里一般修改是4个G一个实例的大小。
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
重启服务
[root@localhost ~]# /usr/local/tomcat8/bin/shutdown.sh
[root@localhost ~]# /usr/local/tomcat8/bin/startup.sh
修改之前
修改之后