JDK/Tomcat升级

背景:公司要求项目引入SSO(Single Sign On),SSO对JDK版本要求最低是1.7,而目前机器使用的是1.6版本,需要升级JDK。


参考: Tomcat8安装和配置、优化 G1垃圾回收器 实战Java虚拟机

升级JDK

公司测试线上服务器安装的JDK版本是jdk1.6.0_45,我打算安装最新的Jre1.8.0_121。

JDK与JRE区别

JVM = Class loader system + Runtime data area + Execution Engine.
JRE = JVM + Java packages classes(like util, math, lang, awt, swing etc)+ Runtime libraries.
JDK = JRE + Development/debugging tools.
JDK/JRE关系
JDK/JRE关系

我并不需要在测试线上机器上打包编译,仅仅需要一个可供应用运行的环境,所以我选择下载Jre

修改Tomcat Jre配置

修改Tomcat文件夹下bin/catalina.sh文件,文件头添加。

JRE_HOME=/XXX/jre1.8.0_121

这样在Tomcat启动时就会使用指定的Jre环境。

升级Tomcat

升级Tomcat到9.0.0.M17版本(该版本运行环境必须>=1.8)。

修改Tomcat文件夹下bin/catalina.sh文件,文件头添加。

CATALINA_HOME=Tomcat路径
$CATALINA_HOME/catalina.pid

Linux下启动、关闭Tomcat分别执行bin下startup.sh和shutdown.sh脚本。

如果执行shutdown.sh仍然无法停止Tomcat,可以修改shutdown.sh脚本。

//最后一行
exec "$PRGDIR"/"$EXECUTABLE" stop "$@"
//改为
exec "$PRGDIR"/"$EXECUTABLE" stop 10 -force

Tomcat优化

修改conf/server.xml文件。

<Executor name="tomcatThreadPool" 
namePrefix="catalina-exec-"
        maxThreads="500" 
        minSpareThreads="100"
        maxQueueSize = "100"
        prestartminSpareThreads="true"/>

参数说明:

  • name:用于区分线程池属性,必须独一无二。
  • namePrefix:线程池创建线程名称前缀。
  • maxThreads:线程池最大值,默认值200。
  • prestartminSpareThreads:默认false,只有true时minSpareThreads才会有效果。
  • minSpareThreads:线程池最小值,默认25。
  • maxQueueSize:最大的等待队列数,超过则拒绝请求,默认Integer.MAX_VALUE。
  • className:默认值org.apache.catalina.core.StandardThreadExecutor,实现org.apache.catalina.Executor接口,最好不要修改。
  • threadPriority:线程优先级,默认5。
  • daemon:是否以守护线程运行,默认true。
  • maxIdleTime:当线程池线程数量大于minSpareThreads时,一个空闲线程最大存活时间,默认1分钟。
  • threadRenewalDelay:如果有ThreadLocalLeakPreventionListener配置,会监听请求是否停止;停止时,会更新线程,为了避免同一时刻更新所有线程,设置任意2个线程更新间隔时间,默认1秒。
<Connector 
   executor="tomcatThreadPool"
   port="8080" 
   protocol="org.apache.coyote.http11.Http11Nio2Protocol" 
   connectionTimeout="20000" 
   maxConnections="10000" 
   redirectPort="8443" 
   enableLookups="false" 
   acceptCount="100" 
   maxPostSize="10485760" 
   compression="on" 
   disableUploadTimeout="true" 
   compressionMinSize="2048" 
   acceptorThreadCount="2" 
   compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript" 
   URIEncoding="utf-8"
/>

参数说明:

  • protocol,默认HTTP/1.1,org.apache.coyote.http11.Http11Nio2Protocol(Tomcat8/9)org.apache.coyote.http11.Http11NioProtocol(Tomcat6/7)
  • allowTrace:是否运行TRACE HTTP请求,默认false。
  • asynTimeout:异步请求超时时间,默认30000(30秒)。
  • enableLookups:默认false,禁用DNS查询功能。
  • maxHeaderCount:header中参数个数,默认100。
  • maxParameterCount:GET/POST请求中带有参数个数,默认10000个。
  • maxPostSize:以FORM URL参数方式的POST提交方式,限制提交最大的大小,默认是2M;设置-1禁用限制。
  • port:tcp端口,设置0则Tomcat随机找一个空闲端口使用。
  • redirectPort:接收到SSL请求后重定向的端口号。
  • URIEncoding:URI编码格式。
  • acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认100。
  • acceptorThreadCount:接受连接的线程数,默认值1。多核CPU最好设置成2。
  • compressableMimeType:默认值text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,逗号分隔,HTTP compression参数来使用。
  • compression:使用GZIP压缩来节省带宽,"on":打开,"off":关闭。
  • compressionMinSize:默认值2048,compression设置"on"生效,输出数据压缩最小值。
  • connectionTimeout:连接超时时间,默认60秒。
  • connectionUploadTimeout:针对文件上传的超时时间,disableUploadTimeout参数必须设置为false。
  • disableUploadTimeout:设置true禁止服务器对文件上传给予更长的超时时间。
  • executor:指定执行器。
  • maxConnections:服务器能接受和处理的最大连接数;当连接数到达该值时,服务接受连接但不处理,接受连接数据受acceptCount控制。NIO、NIO2默认值10000。

JVM优化

原先JVM参数配置:

-server -Xms8g -Xmx8g -Xmn1g -Xss2048K 
-XX:PermSize=512m -XX:MaxPermSize=512m 
-XX:ParallelGCThreads=8 
 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
 -XX:+UseCMSCompactAtFullCollection 
-XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=10 
-XX:CMSInitiatingOccupancyFraction=80 -Dxxx=xxx

参数说明:

  • -server:使用Server模式运行程序,会尝试收集更多的系统性能信息,使用更复杂的优化算法对程序进行优化。
  • -Xmx...m:设置JVM最大可用内存。
  • -Xms...m:设置JVM最小可用内存,可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
  • -Xmn..m:设置JVM年轻代内存大小。
  • -Xss...k:设置线程栈大小。
  • -XX:PermSize=...m:设置永久代大小。
  • -XX:MaxPermSize=...m:设置最大永久代大小。
  • -XX:+UseParNewGC:新生代使用ParNew回收器。
  • -XX:+UseConcMarkSweepGC:老年代使用CMS。
  • -XX:ParallelGCThreads=.:ParNew回收器工作时线程数量,CPU数量小于8时,值等于CPU数量;CPU大于8时,值为3+(5*CPU_COUNT)/8。
  • -XX:+UseCMSCompactAtFullCollection:CMS是一个标记清除回收器,会产生内存碎片,该设置在垃圾收集完成后,进行一次内存碎片整理。
  • -XX:CMSInitiatingOccupancyFraction:指定当老年代空间使用率达到多少时,进行一次CMS垃圾回收。
  • -XX:SurvivorRatio=.:年轻代分为eden+2survivor(from,to),比值代表eden/survivor的值。
  • -XX:MaxTenuringThreshold=..:新生代对象存活次数(经过GC),晋升老年代。
  • -Dxxx=xxx:设置应用需要的参数。
CMS堆结构
CMS堆结构

CMS(Concurrent Mark Sweep)并发标记清除,多次垃圾回收之后会产生内存碎片,需要在多次GC之后进行一次内存碎片整理。

G1(Garbage-First)是JDK 1.7中正式使用全新的垃圾回收器,G1回收器拥有独特的垃圾回收策略;从分代上看,G1依然属于分代垃圾回收器,会区分年轻代和老年代;但从堆结构上看,它不要求整个年轻代、老年代都连续;使用了分区算法。

G1堆结构
G1堆结构

G1特点:

  • 并行性: G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。
  • 并发性: G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此一般来说,不会在整个回收期间完全阻塞应用程序。
  • 分代GC: G1依然是一个分代收集器,但是和之前回收器不同,同时兼顾年轻代和老年代;对比其他回收器,他们或工作在年轻代或老年代。
  • 空间整理: G1在回收过程中,会进行适当的对象移动,减少空间碎片。
  • 可预见性: 由于分区的原因,G1可以只选取部分区域进行内存回收,这样缩小了回收后的范围,因此对于全局停顿也能得到较好的控制。

新的JVM参数:

-server -Xms8g -Xmx8g -Xss2048K -XX:+UseG1GC 
-XX:MaxGCPauseMillis=500 XX:InitiatingHeapOccupancyPercent=55 
-XX:ParallelGCThreads=10 -XX:+DisableExplicitGC

把JVM参数配置在bin/catalina.sh文件头中。

JAVA_OPTS="xxx"

G1参数说明:

  • -XX:+UseG1GC:使用 G1 (Garbage First) 垃圾收集器.
  • -XX:MaxGCPauseMillis=n:设置最大GC停顿时间(GC pause time)指标(target). 这是一个软性指标(soft goal), JVM 会尽量去达成这个目标.
  • -XX:InitiatingHeapOccupancyPercent=n:启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45.
  • -XX:G1ReservePercent=n:设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10.
  • -XX:G1HeapRegionSize=n:使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,169评论 11 349
  • 参数设置 在Java虚拟机的参数中,有3种表示方法用“ps -ef |grep "java"命令,可以得到当前Ja...
    九问阅读 9,100评论 2 52
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,350评论 1 56
  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 4,516评论 4 86
  • 最近喜欢听电子音乐,而且还把音乐开到最大,这种快让神经都在跳动的音乐似乎可以让人得到释放。这些歌适合白天听,而有些...
    夏天有雨cjy阅读 357评论 0 0