tomcat优化jvm参数-成都创新互联网站建设

关于创新互联

多方位宣传企业产品与服务 突出企业形象

公司简介 公司的服务 荣誉资质 新闻动态 联系我们

tomcat优化jvm参数

tomcat

成都创新互联主营濂溪网站建设的网络公司,主营网站建设方案,APP应用开发,濂溪h5小程序设计搭建,濂溪网站营销推广欢迎濂溪等地区企业咨询

1、Tomcat 简介Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由
Apache、Sun和其他一些公司及个人共同开发而成。
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。目前Tomcat最新版本为9.0。Java容器还有resin、weblogic等。
Tomcat官网: http://tomcat.apache.org

2、Tomcat好帮手---JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 http://www.oracle.com/technetwork/java/javase/downloads/index.html

端口: tomcat自身服务的端口:8005
tomcat和其他应用通信的端口:8009 tomcat给客户端浏览器访问页面使用的端口:8080

JVM基础

一、JVM 虚拟机常识作为了解JVM 虚拟机的开始。我们很有必要弄明白以下两个问题。

1.什么是JAVA虚拟机

所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚

拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行
的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都呗限制于虚拟机提供的资源中。

2.JAVA 如何做到跨平台

同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台。

1/14

3.虚拟机基本结构我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。

1)、类加载子系统
负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字量。

2/14

2)、Java堆

在虚拟机启动的时候建立,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都放Java堆中。堆空间是所有线程共享的,这是一块与Java应用密切相关的内存区间。

3)、Java的NIO库(直接内存)

允许Java程序使用直接内存。直接内存是在Java堆外的、直接向系统申请的内存区间。通常访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。由于直接内存
在Java堆外,因此它的大小不会受限于Xmx指定的最大堆大小。但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。

4)、垃圾回收系统
垃圾回收系统是Java虚拟机的重要组成部分,垃圾回收器可以对方法区、Java堆和直接内存进行回
收。

5)、Java栈

每一个Java虚拟机线程都有一个私有的Java栈。一个线程的Java栈在线程创建的时候被创建。Java保存着帧信息,Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。

4.虚拟机堆内存结构

JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。

新生代:新生区

类在这里产生和应用,最后被垃圾回收。所有的类在伊甸区被new出来,当伊甸区满了,GC会对该区不用的对象销毁,剩余有用的转到幸存区。

老年代:老年区用于存放生成周期比较长的对象。

3/14

永久代:永久区存放JDK自带的class,interface。

JVM 运维实用排障工具

jps

1、jps

用来查看Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
常用参数如下:
-q:忽略输出的类名、Jar名以及传递给main方法的参数,只输出pid -m:输出传递给main方法的参数,如果是内嵌的JVM则输出为null -l:输出完全的包名,应用主类名,jar的完全路径名-v:输出传给jvm的参数

注意: 使用jps 时的运行账户要和JVM 虚拟机启动的账户一致。若启动JVM虚拟机是运行的账户为www,那使用jps指令时,也要使用www 用户去指定。 sudo -u www jps

Example:
// 查看已经运行的JVM 进程的实际启动参数
[root@java-tomcat1 ~]# jps -v

58154 Jps -Denv.class.path=.:/usr/local/java/lib:/usr/local/java/jre/lib:/usr/local/java/lib/tools.jar - Dapplication.home=/usr/local/java -Xms8m

58015 Bootstrap -Djava.util.logging.config.file=/data/application/tomcat/conf/logging.properties - Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 - Djava.protocol.handler.pkgs=org.apache.catalina.webresources - Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/data/ application/tomcat -Dcatalina.home=/data/application/tomcat -Djava.io.tmpdir=/data/application/tomcat/temp

部署Tomcat

Tomcat,Resin,JBOSS,WebSphere,Weblogic属于oracle

一、Tomcat Http Server 1.安装JDK和tomcat
#tar xf apache-tomcat-7.0.34.tar.gz -C /usr/local/

#tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local

#ln -s /usr/local/jdk1.8.0_91 /usr/local/java 做了一个连接,或者是改名.或者直接mv
#ln -s /usr/local/apache-tomcat-7.0.34 /usr/local/tomcat
2.修改环境变量

vim /etc/profile JAVA_HOME=/usr/local/java

4/14

PATH=$JAVA_HOME/bin:$PATH //使用JAVA_HOME下的JAVA命令 export JAVA_HOME PATH
CATALINA_HOME=/usr/local/tomcat //Tomcat安装目录 export CATALINA_HOME
让环境变量生效

#source /etc/profile 3.检测
#java -version

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
4.启动Tomcat

/usr/local/tomcat/bin/startup.sh //启动tomcat

Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.7.0_11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

netstat -tnlp |grep java

tcp 0 0 ::ffff:127.0.0.1:8005 ::: LISTEN 6191/java
tcp 0 0 :::8009 :::
LISTEN 6191/java
tcp 0 0 :::8080 :::* LISTEN 6191/java

/usr/local/tomcat/bin/shutdown.sh //关闭tomcat关于tomcat端口:

Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector组件负责接收客户的请
求,以及把Tomcat服务器的响应结果发送给客户。默认情况下,Tomcat在server.xml中配置了两种连接器:
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。

第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
8005是tomcat本身的端口

  1. 测试
    http://192.168.2.251:8080/ 二、安装MySQL(略) 使用mysql(略)1.使用mariadb
    yum -y install mariadb mariadb-server systemctl start mariadb

mysqladmin -u root password '123'

创建数据库并指定字符集 create database jspgou default charset=utf8; flush privileges;

三、部署jspgou

ls /usr/local/tomcat/webapps/ //默认网站的基目录base

docs examples host-manager manager ROOT

ls /usr/local/tomcat/webapps/ROOT //默认网站的主目录

#unzip jsp…… .zip

#cp -r ROOT/ /usr/usr/local/tomcat/webapps/

四、更改数据库链接

程序包内vim /usr/local/tomcat/webapps/ROOT\WEB-INF\config\jdbc.properties文件第20行左右jdbc.url=jdbc:mysql://127.0.0.1:3306/创建好的数据库名?characterEncoding=UTF-8 jdbc.username=root
jdbc.password=123

3.导入数据:
mysql -u root -p123 -D jspgou < jspgou.sql

五、测试
系统管理后台登录:http://localhost:8080/jeeadmin/jspgou/index.do
用户名:admin

5/14

密 码:123456

tomcat基础

1、tomcat主目录介绍 [root@java-tomcat1 tomcat]# tree -L 1
.
├── bin #存放tomcat的管理脚本

├── BUILDING.txt
├── conf #tomcat的配置文件

├── CONTRIBUTING.md
├── lib #web应用调用的jar包存放路径

├── LICENSE
├── logs #tomcat日志存放目录

├── NOTICE

├── README.md

├── RELEASE-NOTES

├── RUNNING.txt
├── temp #存放临时文件
├── webapps #默认网站发布目录
└── work #存放编译生产的.java与.class文件

2.webapps目录介绍 [root@java-tomcat1 webapps]# tree -L 1
.

├── docs #tomcat的帮助文档 ├── examples #web应用实例 ├── host-manager #主机管理 ├── manager #管理 └── ROOT #默认站点根目录

3.Tomcat配置文件目录介绍(conf) [root@java-tomcat1 conf]# tree -L 1
.

├── Catalina ├── catalina.policy

├── catalina.properties ├── context.xml

├── logging.properties

├── logs
├── server.xml # tomcat 主配置文件
├── server.xml.bak

├── server.xml.bak2
├── tomcat-users.xml # tomcat 管理用户配置文件
├── tomcat-users.xsd

└── web.xml

4.Tomcat的管理
启动程序 #/data/application/tomcat/bin/startup.sh 关闭程序 #/data/application/tomcat/bin/shutdown.sh

5.Tomcat日志说明
[root@java-tomcat1 bin]# tail -f /data/application/tomcat/logs/catalina.out

org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/application/tomcat/webapps/host-manager] has finished in [21] ms
04-Jul-2019 22:40:00.026 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/data/ application/tomcat/webapps/manager]
04-Jul-2019 22:40:00.042 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/data/ application/tomcat/webapps/manager] has finished in [16] ms

6/14

04-Jul-2019 22:40:00.048 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 04-Jul-2019 22:40:00.058 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"] 04-Jul-2019 22:40:00.062 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 479 ms
发现启动时间较长,其中有一项的启动时间占据了绝大多数

24-Nov-2017 15:09:50.629 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /application/ apache-tomcat-8.0.27/webapps/memtest.war has finished in 58,892 ms
发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session ID是通过SHA1算法计算得到

的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥。

解决Tomcat启动慢的方法Tomcat启动慢主要原因是生成随机数的时候卡住了,导致tomcat启动不了。
是否有足够的熵来用于产生随机数,可以通过如下命令来查看

[root@java-tomcat1 ~]# cat /proc/sys/kernel/random/entropy_avail 1065

为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断,网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。
方法一:

vim $TOMCAT_HOME/bin/catalina.sh ---添加如下内容 if [[ "$JAVA_OPTS" != -Djava.security.egd= ]]; then
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"

fi

这个系统属性egd表示熵收集守护进程(entropy gathering daemon)

方法二:

yum install rng-tools # 安装rngd服务(熵服务,增大熵池) systemctl start rngd # 启动服务

tomcat主配置文件详情

Tomcat的配置文件:
Tomcat的配置文件默认存放在/usr/local/tomcat/conf目录中,主要有以下几个
server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主组件的相关配置信息;

web.xml:遵循Servlet规范标准的配置文件,用于配置servlet,并为所有的Web应用程序提供包括MIME映射等默认配置信息;
tomcat-user.xml:Realm认证时用到的相关角色、用户和密码等信息;Tomcat自带的manager默认情
况下会用到此文件;在Tomcat中添加/删除用户,为用户指定角色等将通过编辑此文件实现;catalina.policy:Java相关的安全策略配置文件,在系统资源级别上提供访问控制的能力;catalina.properties:Tomcat内部package的定义及访问相关的控制,也包括对通过类装载器装载的内
容的控制;Tomcat6在启动时会事先读取此文件的相关设置;
logging.properties: Tomcat6通过自己内部实现的JAVA日志记录器来记录操作相关的日志,此文件即为日志记录器相关的配置信息,可以用来定义日志记录的组件级别以及日志文件的存在位置等;

context.xml:所有host的默认配置信息;

1、Server组件:
port: 接收shutdown指令的端口,默认仅允许通过本机访问,默认为8005;
shutdown:发往此Server用于实现关闭tomcat实例的命令字符串,默认为SHUTDOWN;

2、Service组件:

7/14

Service主要用于关联一个引擎和与此引擎相关的连接器,每个连接器通过一个特定的端口和协议接收入站

请求交将其转发至关联的引擎进行处理。困此,Service要包含一个引擎、一个或多个连接器。如上面示例中的定义:


这定义了一个名为Catalina的Service,此名字也会在产生相关的日志信息时记录在日志文件当中。
Service相关的属性:
className: 用于实现service的类名,一般都是org.apache.catalina.core.StandardService。name:此服务的名称,默认为Catalina;
3、Connector组件:
进入Tomcat的请求可以根据Tomcat的工作模式分为如下两类:

Tomcat作为应用程序服务器:请求来自于前端的web服务器,这可能是Apache, IIS, Nginx等;Tomcat作为独立服务器:请求来自于web浏览器;
Tomcat应该考虑工作情形并为相应情形下的请求分别定义好需要的连接器才能正确接收来自于客户端的请求。一个引擎可以有一个或多个连接器,以适应多种请求方式。

定义连接器可以使用多种属性,有些属性也只适用于某特定的连接器类型。一般说来,常见于server.xml中的连接器类型通常有4种:
1) HTTP连接器 2) SSL连接器 3) AJP 1.3连接器 4) proxy连接器如上面示例server.xml中定义的HTTP连接器:

4、Engine组件:
Engine是Servlet处理器的一个实例,即servlet引擎,默认为定义在server.xml中的Catalina。Engine需要
defaultHost属性来为其定义一个接收所有发往非明确定义虚拟主机的请求的host组件。如前面示例中定义的:


5、Host组件:
位于Engine容器中用于接收请求并进行相应处理的主机或虚拟主机,如前面示例中的定义:

autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用程序文件是否自动进行deploy;默认为true;unpackWars:在启用此webapps时是否对WAR格式的归档文件先进行展开;默认为true;

Tomcat管理功能使用

注意:测试功能,生产环境不要用

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置tomcat-users.xml 文件。

[root@java-tomcat1 ~]# vim /data/application/tomcat/conf/tomcat-users.xml

# 在此行前加入上面三行

[root@java-tomcat1 conf]# vim ../webapps/manager/META-INF/context.xml

注释掉以下部分

重启tomcat:

8/14

[root@java-tomcat1 bin]# ./shutdown.sh [root@java-tomcat1 bin]# ./startup.sh

输入之前配置的账户与密码即可:

报错

注意:导入数据库时如果报错
1.把所有datetime类型的字段默认值改成CURRENT_TIMESTAMP

2.凡是NOT NULL 的报错 :%s/00000000/CURRENT_TIMESTAMP/

3.将压缩包内 DB文件中jspgou.sql文件导入至创建好的jspgou数据库中,如导入中出现执行sql语句过长问题,请修改mysql配置文件my.cnf中max_allowed_packet参数为64m,默认为1m

mysql数据库:
[root@jspgou DB]# vim /etc/my.cnf sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUB explicit_defaults_for_timestamp=1
修改完配置文件后重新启动服务后在导入数据库

tomcat多实例部署

多实例:1.单机多实例,发布网站的目录不动

2.tomcat在不同服务器上,通过共享网站目录实现不同tomcat主机访问统一网站

Tomcat 一机多实例多实例运行不同的应用(类似虚拟主机)

9/14

多实例运行相同的应用(实现负载均衡,支持高并发处理,session问题)

tomcat单机多实例配置
CATALINA_BASE: 在一个工作目录下创建多实例目录
instance1: /usr/local/tomcat/instance1/{conf,logs,temp,work} 8081 8091
instance2: /usr/local/tomcat/instance2/{conf,logs,temp,work} 8082 8092
instance3: /usr/local/tomcat/instance3/{conf,logs,temp,work} 8083 8093

webapps:

拷贝原来单实例的webapps到/下 /webapps/ROOT

  1. 以单实例为基础

[root@www ~]# /usr/local/tomcat/bin/shutdown.sh

配置多实例步骤:

1.创建多实例目录,根据实例多少确定分别创建目录instance1 instance2 instance3,拷贝原来的conf,log,temp,work到3个目录下
[root@www ~]# tree -d -L 2 /usr/local/tomcat/

/usr/local/tomcat/ ├── bin
├── instance1

│├── conf

│├── logs

│├── temp

│└── work ├── instance2
│├── conf

│├── logs

│├── temp

│└── work ├── instance3
│├── conf

│├── logs

│├── temp

│└── work └── lib

  1. 配置实例server.xml

[root@www ~]# vim /usr/local/tomcat/instance1/conf/server.xml //修改8005
redirectPort="8443" />


......

  1. 脚本内容

[root@www ~]# vim /usr/local/tomcat/instance1/ins1.sh

10/14

  1. 启动测试

[root@www ~]# /usr/local/tomcat/instance1/ins1.sh start [root@www ~]# /usr/local/tomcat/instance2/ins2.sh start [root@www ~]# /usr/local/tomcat/instance3/ins3.sh start

[root@www ~]# ss -tnlp |grep :80

LISTEN 0 100 :::8081 ::: users:(("java",pid=7288,fd=48)) LISTEN 0 100 :::8082 ::: users:(("java",pid=7468,fd=48)) LISTEN 0 100 :::8083 :::* users:(("java",pid=7496,fd=48))

LISTEN 0 1 ::ffff:127.0.0.1:8091 ::: users:(("java",pid=7288,fd=61)) LISTEN 0 1 ::ffff:127.0.0.1:8092 ::: users:(("java",pid=7468,fd=61)) LISTEN 0 1 ::ffff:127.0.0.1:8093 :::* users:(("java",pid=7496,fd=61))

11/14

tomcat负载均衡

Nginx配置

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf

这个地方是 地址池,这里包含了后端服务器的地址和端口,这里的名字随便启。 http {

upstream tomcat_pool { #ip_hash; 最大失败次数 失败超时时间

server 192.168.122.105:8081 weight=1 max_fails=2 fail_timeout=2; server 192.168.122.105:8082 weight=1 max_fails=2 fail_timeout=2; server 192.168.122.105:8083 weight=1 max_fails=2 fail_timeout=2; server 192.168.122.105:8084 weight=1 max_fails=2 fail_timeout=2;

}

负载均衡的算法: RR round robin session ip_hash 是常用的负载均衡的算法
server { location / {

proxy_pass http://tomcat_pool; proxy_redirect off; proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

}

会话保持,即将同一个client的访问始终调度到同一后端实例。

服务调优

12/14

1、日志格式配置

[root@java-tomcat1 ~]# cd /data/application/tomcat/conf/ [root@java-tomcat1 conf]# vim server.xml

pattern="%{X-Real-IP}i - %v %t "%r" - %s %b %T "%{Referer}i" "% {User-Agent}i" %a "-" "-"" />

[root@java-tomcat1 conf]# mkdir -p /data/www

2、JVM 参数优化

[root@java-tomcat1 conf]# cd ../bin/ [root@java-tomcat1 bin]# cp catalina.sh catalina.sh.bak [root@java-tomcat1 bin]# vim catalina.sh

JAVA_OPTS="$JAVA_OPTS -Xms4096m -Xmx4096m -XX:PermSize=1024m -XX:MaxPermSize=2048m"

3、开启GC日志

vim catalina.sh

JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/gc-%t.log" [root@java-tomcat1 bin]# mkdir /data/logs

设置初始堆、非堆内存大小以及年轻代

-Xms50m –Xmx200m -XX:PermSize=30m -XX:MaxPermSize=60m
-Xloggc:eclipse_gc.log (设置垃圾回收日志打印的文件,文件名称可以自定义)

-XX:+PrintGCTimeStamps (打印垃圾回收时间信息时的时间格式) -XX:+PrintGCDetails (打印垃圾回收详情)
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。

-Xms:初始堆大小,默认为物理内存的1/64(<1GB) -Xmx:最大堆大小
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的
New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。

13/14

14/14


分享标题:tomcat优化jvm参数
文章起源:http://kswsj.cn/article/gpdggj.html

其他资讯