一、JVM
1、JVM产生GC的位置
Eden(新生代) Minor GC 算法(复制)
Old tenure(老年代) Major(Full) GC (整理-压缩)算法
2、JVM 堆(Heap)内存大小参数
-Xmn 新生代 8:1:1比例
-Xms 设置初始化堆内存大小
-Xmx 设置堆内存最大大小
产生java.lang.OutOfMemoryError: Java heap space Heap size 的位置
异常原因:
经过Minor GC、Full GC、对象依然不能被回收,而堆内存不够就会发生该异常。
JDK 1.7
-XX:PermSize 永久代初始大小 默认是物理内存的1/64
-XX:MaxPermSize 永久代最大大小 默认是物理内存的1/4
产生java.lang.OutOfMemoryError: PermGen space 的位置
异常原因:
由于永久代是不会被GC(Garbage Collection) 回收的,只有在退出JVM时才会被回收
当过多的使用类库,永久代内存大小无法容纳更多的数据就会产生该异常。
JDK 1.8
永久代 -->元空间(MetaSpace)
-XX:MetaSpaceSize=128m
-XX:MaxMetaspaceSize=128m
-XX:+PrintGCDetails 打印GC
二、Tomcat 优化参数,基于JDK1.7
2、Tomcat JVM 参数
export JAVA_OPTS="-server -Xms512m -Xmx512m -Xss512k "
1、-server
启用JDK的Server版
tomcat 默认是以java -client的模式运行的,server既意味着你的tomcat是以真实的生产模式允许的
也就意味着你的tomcat有更大,更高的并发能力,更好的JVM垃圾回收机制,可以获得更多的负载与吞吐量
2、-Xms512m -Xmx512m
参考值物理内存的3/4(4分之3内存大小):如服务器内存1024M,则1024/4*3=768M
-Xmx JVM堆区最大内存(默认物理内存的1/4)
-Xms JVM堆区初始内存(默认物理内存的1/64)
建议大小配置相同,避免JVM内存大小的大起大落
默认JVM堆内存小于40%时,会调整到-Xmx,堆内存空闲内存大于70%时,会调整到-Xms
可以通过jmap 查看如下参数验证
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
(不要使用32位的jdk,32位的最大内存只能配置到4G)
-Xmn 年轻代的堆内存大小,Eden+2 survivorspace(默认物理内存的1/64)
3、 -Xss512k
-Xss 设置每个线程的栈大小(默认大小1M),一般不要超过1M,不然容易出现out of memory
建议配置512k,
4、 -XX:+AggressiveOpts
将JDK优化版后的新特性自动注入,自我优化,自适应配置
参考:http://blog.csdn.net/zhoutao198712/article/details/7842659
5、-XX:+UseBiasedLocking
开启偏向锁
启用一个优化了的线程锁,对于高并发访问很重要,太对的请求忙不过来,它自动优化
对于各自长短不一的请求,出现的阻塞排队现象,它自己优化
简单案例:银行办理业务,银行客服询问业务,取钱业务A窗口,办卡业务B窗口,其他业务C窗口
参考:http://blog.163.com/silver9886@126/blog/static/35971862201472274958280/
6、-XX:PermSize=128M -XX:MaxPermSize=256M
-XX:PermSize 永久代初始大小
-XX:MaxPermSize 最大大小
根据自己实际情况进行配置,三方类库jar包大小,不需要多大
7、-XX:MaxNewSize
不建议配置的参数
-XX:MaxNewSize 设置最大的年轻代大小(默认16M)
-XX:NewSize 设置年轻代大小
8、-XX:+DisableExplicitGC
忽略手动调用System.gc(),使得手动的System.gc()变成一个空调用
完全不建议使用手工调用System.gc(),可能会引发各种为题
如果确认工程中没有此类代码,可以不做配置,建议配置
9、-XX:MaxTenuringThreshold=15
-XX:MaxTenuringThreshold 设置对象在新生代中经过多少次Minor GC 才进入老年代(默认15)
(1)、如果设置为0的话,则新生代对象不经过survivor区直接进入老年代,对于老年代比较多的应用可以提高效率
(2)、如果此值设置较大,则年轻代对象会在survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率
(3)、这个值是根据本地监控得到的具体值
10、-XX:+UseConcMarkSweepGC
即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,因此使用了CMS GC后可以在GC次数增多的情况下,每次GC的响应时间却很短,比如说使用了CMS GC后经过jprofiler的观察,GC被触发次数非常多,而每次GC耗时仅为几毫秒
添加该参数表示启动并发标识-清理(Mark-Sweep)回收器(CMS)
11、-XX:+UseParNewGC
对年轻代采用多线程并行回收,这样收得快
12、-XX:+CMSParallelRemarkEnabled
在使用UseParNewGC 的情况下, 尽量减少mark 的时间,降低标记停顿
13、-XX:+UseCMSCompactAtFullCollection
在使用concurrent gc 的情况下, 防止 memoryfragmention,
对live object 进行整理, 使 memory 碎片减少。
14、-XX:LargePageSizeInBytes
指定 Java heap的分页页面大小
参考:http://blog.csdn.net/chluknight/article/details/6689323
15、-XX:+UseFastAccessorMethods
get,set 方法转成本地代码
16、-XX:+UseCMSInitiatingOccupancyOnly
指示只有在 old generation 在使用了初始化的比例后concurrent collector 启动收集
17、-Djava.awt.headless=true
这个参数一般我们都是放到最后使用,这个参数的作用是这样的,有时候我们会在项目中使用一些图表工具
比如,jfreechart,用于在WEB网页输出gif/jpg等流
在Windows我们运行一般不会有什么问题,但是到了linux环境下,经常会遇到一个exception,导致你在linux环境下无法正常显示图片,加上这个参数可以避免这样的情况出现
参考文章:
http://breezylee.iteye.com/blog/2043056
http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html