常用的JVM参数
1、配置JAVA虚拟机的空间大小
实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大。以避免程序频繁的申请堆空间。设置为物理内存的一半.
-Xms:初始堆大小
-Xmx:最大堆大小
[root@localhost bin]# ps -ef | grep java //查看java配置参数
root 1473 1 74 10:02 pts/0 00:00:09 /usr/local/java/bin/java -Djava.util.logging.config.fi
le=/usr/local/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= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
[root@java-tomcat1~]# cd /usr/local/tomcat/bin //进入JAVA配置文件
[root@java-tomcat1 bin]# vim catalina.sh //添加空间配置文件
JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx1024m"
[root@localhost bin]# bash shutdown.sh //关闭Tomcat
[root@localhost bin]# bash startup.sh //开启Tomcat
[root@localhost bin]# ps -ef | grep java
root 1567 1 96 10:05 pts/0 00:00:15 /usr/local/java/bin/java -Djava.util.logging.config.fi
le=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Xms1024m -Xmx1024m - //代表添加完成 Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap startroot 1583 1427 0 10:05 pts/0 00:00:00 grep --color=auto java
2、开启GC日志
跟踪JAVA虚拟机的垃圾回收
GC日志:jvm垃圾回收,记录jvm的运行状态,oom内存溢出的报错信息等。
-
%t 将会被替代为时间字符串,格式为: YYYY-MM-DD_HH-MM-SS
-
跟上述添加设置JAVA空间步骤一样,在此基础上追加-Xloggc:/data/logs/gc-%t.log [root@java-tomcat1 bin]# vim catalina.sh 添加 JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx1024m -Xloggc:/data/logs/gc-%t.log" [root@java-tomcat1 bin]# mkdir -p /data/logs 重启tomcat [root@localhost bin]# cd /data/logs/ //查看配置是否完成 [root@localhost logs]# ls gc-2021-05-25_11-06-24.log gc-2021-05-25_11-06-35.log
3、JVM运维实用排障工具
jps工具
用来查看Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程
常用参数如下:
-v:输出传给jvm的参数
注意: 使用jps 时的运行账户要和JVM 虚拟机启动的账户一致。若启动JVM虚拟机是运行的账户为www,那使用jps指令时,也要使用www 用户去指定。 sudo -u www jps
案例:
#查看已经运行的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
4、jstack
jstack用于打印出给定的java进程ID或远程调试服务的Java堆栈信息。此信息通常在运维的过程中被保存起来(保存故障现场),以供 RD (开发人员)们去分析故障。
常用参数如下:
jstack <pid>
jstack [-l] <pid> //长列表. 打印关于锁的附加信息
jstack [-F] <pid> //当’jstack [-l] pid’没有响应的时候强制打印栈信息
案例:
打印JVM 的堆栈信息,以供问题排查
[root@java-tomcat1 ~]# jstack -F 38360 > /tmp/jstack.log
5、Tomcat的安全优化
1、降权启动(强制)
分类 | 配置内容说明 | 标准配置 | 备注 |
---|---|---|---|
降权启动 | 1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发; | 避免一旦tomcat 服务被入侵,黑客直接获取高级用户权限危害整个server的安全; |
[root@java-tomcat1 ~]# useradd tomcat
[root@java-tomcat1 ~]# chown tomcat.tomcat /usr/local/tomcat/ -R
[root@java-tomcat1 ~]# su -c '/usr/local/tomcat/bin/start.sh start' tomcat
Using CATALINA_BASE: /data/application/tomcat
Using CATALINA_HOME: /data/application/tomcat
Using CATALINA_TMPDIR: /data/application/tomcat/temp
Using JRE_HOME: /usr/local/java
Using CLASSPATH: /data/application/tomcat/bin/bootstrap.jar:/data/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@java-tomcat1 ~]# ps -ef | grep tomcat
tomcat 1065 1 64 20:33 ? 00:00:06 /usr/local/java/bin/java -Djava.util.logging.config.file=/data/applicationtomcat/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= -classpath /data/application/tomcat/bin/bootstrap.jar:/data/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/data/application/tomcat -Dcatalina.home=/data/application/tomcat -Djava.io.tmpdir=/data/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 1112 1027 0 20:33 pts/0 00:00:00 grep --color=auto tomcat
6、Tomcat性能优化
1)、优化代码:该项需要开发经验足够丰富,对开发人员要求较高
2)、jvm**优化机制 **垃圾回收机制 把不需要的内存回收
优化jvm--优化垃圾回收策略
优化catalina.sh配置文件。在catalina.sh配置文件中添加代码
# tomcat分配1G堆内存模板
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m
# 重启服务
su -c '/home/tomcat/tomcat8_1/bin/shutdown.sh' tomcat
su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
3)、加足够大的内存:此方法投入资金比较大
4)、每天0点定时重启tomcat:此方法应用较为广泛
7、设置JVM缓存
在主机名解析为IP地址后,资源IP地址将保存在JVM的高速缓存中。如果改变了资源IP地址,则需要重新启动应用服务器,identity Manager能够检测所做更改(ID-3635)。这是Sun JD(1.3及更高版本)中的设置,可以使用sun.net.inetaddr.ttl属性(通常在jre/lib/security/java.security中设置)控制设置解析成功的域名记录JVM中缓存的有效时间。JVM默认是永久有效,这样一来域名IP重定向必须重启JVM,这里修改为5秒有效,0表示禁止缓存,-1表示永远有效
java.security.Security.setProperty("networkaddress.cache.ttl", "5");
//设置解析失败的域名记录JVM中缓存的有效时间,JVM默认是10秒,0表示禁止缓存,-1表示永远有效
java.security.Security.setProperty("networkaddress.cache.negative.ttl", "2");
8、设置DNS缓存
法一、在JAVA_OPTS里设置
-Dsun.net.inetaddr.ttl=3 -Dsun.net.inetaddr.negative.ttl=1
法二、修改property
System.setProperty("sun.net.inetaddr.ttl", "3");
System.setProperty("sun.net.inetaddr.negative.ttl", "1");