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

tomcat JVM 性能优化

2016-05-14 23:00 302 查看
简单回顾一下Java内存模型:

程序计数器:

是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器;如果执行的是native方法,计数器的值为空。

Java虚拟机栈:

生命周期与线程相同,内存模型执行一个方法时会创建一个栈帧用来存储局部变量、动态链接、方法出口。

局部变量存放了编译器的基本数据类型(boolean、byte、char、short、int、long、float、double)、对象引用类型(指向对象起始地址的指针)

本地方法栈:

native方法

Java堆:

所有对象实例、数组都分配在堆上。又分为新生代(Eden空间、两个Survivor空间)、老年代

方法区(又称永久代):

存储虚拟机加载的类信息、常量、静态常量、、即时编译器编译后的的代码

进入主题垃圾收集器

介绍各种垃圾收集器前还要简单提一下几种垃圾收集算法(具体请自行百度)

1.标记-清除

2.复制

3.标记-整理

4.分代收集

Serial(串行)收集器:

历史悠久,很古老的单线程收集器

缺点:在垃圾回收时需要暂停正常工作的线程

ParNew收集器:

Serial的多线程版,许多Server模式下的虚拟机中首选的新生代收集器

Parallel(并行) Scavenge(清理)收集器(又称:吞吐量优先的收集器):

新生代收集器,使用复制算法,又是并行的多线程收集器,它的目标是达到一个可控制的吞吐量=运行代码时间/(运行代码时间+垃圾收集时间)

Serial Old收集器:

Serial收集器老年代版

Parallel Old收集器:

Parallel Scavenge 老年代版本

CMS收集器:

全称:Concurrent(并行) Mark(标记) Sweep(清理),是以最短停顿时间为目标的收集器    注:收集器在垃圾回收的时候会暂停所有工作的线程,这里的最短停顿时间就是暂停线程的时间。

G1收集器:

待补充。。。



说了这么理论知识不如直接来点儿实在的,下面贴出我的tomcat JVM调优参数并对参数做出介绍:

此配置仅是测试,非正式环境配置,请自行根据项目情况进行配置

JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn384m -Xss256k -XX:MaxGCPauseMillis=100 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0
 -Djava.awt.headless=true"




各项参数介绍:

-[b]Xmx1024m:设置JVM最大可用内存为1024M。 

-Xms1024m:设置JVM促使内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。 

-Xmn384m:设置年轻代大小为384m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。 

-Xss256k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。[/b]

-XX:MaxGCPauseMillis=100:每次年轻代垃圾回收的最长时间(最大暂停时间)单位是毫秒

-XX:+UseConcMarkSweepGC:设置年老代为并发收集。

-XX:CMSInitiatingOccupancyFraction=80: 使用cms作为垃圾回收使用80%后开始CMS收集

-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片 


-XX:CMSFullGCsBeforeCompaction=0:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。 






GC日志查看

对应的参数列表
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:../logs/gc.log 日志文件的输出路径
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息