1、安装JDK
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk
2、添加java环境变量
sed -i '$a export JAVA_HOME=/usr/local/jdk' /etc/profile
sed -i '$a export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH' /etc/profile
sed -i '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
关于上面那个sed命令的说明:sed -i.ori :-i表示对文件本身操作,
.ori表示修改的同时备份源文件表示文件内容的最后一行,
a表示在下面进行数据插入
\n :表示插入数据时换行
3、查看java正确安装
which java #有安装目录
java -version #有java信息输出
4、解压tomcat
tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
5、添加tomcat环境变量
echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
source /etc/profile
6、修改tomcat中目录权限 #修改俩处
chown -R root.root /usr/local/jdk/ /usr/local/tomcat/
6-1、tomcat目录结构
[root@localhost tomcat]# tree -L 1
.
├── bin #用以启动,关闭Tomcat或者其他功能的脚本(.bat文件和.sh文件)
├── conf #用以配置Tomcat的XML及DTD文件
├── lib #存放web应用能访问的JAR包
├── LICENSE
├── logs #Catalina和其他Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件
├── webapps #Web应用程序根目录
└── work #用以产生有JSP编译出的Servlet的.java和.class文件
7 directories, 4 files
7、tomcat启动与关闭:
启动程序:/usr/local/tomcat/bin/startup.sh
关闭程序:/usr/local/tomcat/bin/shutdown.sh
7-1、正确启动输出的信息
[root@data-01 webapps]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
7-2、测试访问
[root@data-01 webapps]# curl -I http://localhost:8080
HTTP/1.1 200 OK #200 表示请求成功
netstat -antup | grep java #查看java进程 有3个
8、tomcat配置文件目录
cd /usr/local/tomcat/conf/
server.xml #主配置文件
tomcat-users.xml #Tomcat管理用户配置文件
8-1、修改tomcat管理配置文件---默认是禁用的。推荐禁用--优化之一禁用管理界面。
在<tomcat-users>标签内添加,这个标签在配置文件最后
<role rolename="manager-gui"/> #加入此行
<role rolename="admin-gui"/> #加入此行
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #加入此行
9、重启---重启后即可登录到管理界面
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
10、测试访问--登录到管理界面
http://192.168.88.66:8080/manager/status
提示输入用户及密码 上:8-1 设置的username、password
========================================================
========tomcat多实例操作:多实例出2个,共3个实例。
========================================================
1、拷贝/usr/local/下的tomcat源码包
cd /usr/local/
cp -a apache-tomcat-8.0.27 tomcat8_1
cp -a apache-tomcat-8.0.27 tomcat8_2
2、创建多实例的网页根目录
mkdir -p /data/www/www/ROOT
3、修改对应实例目录下的配置文件 server.html 中的端口以及网页根目录路径
<Server port="8011" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
<Host name="localhost" appBase="/data/www/www"
123 <Host name="localhost" appBase="webapps"
124 unpackWARs="true" autoDeploy="true">
125 <Context path="" docBase="/data/www/www"
126 debug="0" reloadable="false" crossContext="true" />
4、启动多实例tomcat
/usr/local/tomcat8_1/bin/startup.sh #启动第一个实例
/usr/local/tomcat8_2/bin/startup.sh #启动第二个实例
5、查看对应的端口是否启用
netstat -antup | grep java
========================================================================================
6、Nginx+Tomcat反向代理集群
6-1、修改Nginx配置文件,添加upstream模块对应实例中的tomcat实例;
upstream web_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
6-2、location匹配中: 添加
proxy_pass http://web_pools;
========================================================================================
一、maven搭建:
1、tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
2、ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
tail -2 /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
source /etc/profile
mvn -version #查询版本
Java环境变量配置:
JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
安装jenkins后“可选插件”列表为空
解决方案
选择插件管理-高级-升级站点-更改URL为
[http://mirror.xmission.com/jenkins/updates/update-center.json]-点击提交即可
=========================================================================================
二、使用Tomcat安装Jpress,类似于wordpress个人博客。
1、解压:apache-maven
tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
2、添加环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
source /etc/profile
3、检测是否安装成功
mvn -version #出现这个表示成功
4、将jpress的war拷贝到tomcat的根目录下
ls -l jpress-web-newest.war
mv jpress-web-newest.war /data/www/www/ROOT/
5、解压jpress的war包
cd /data/www/www/ROOT/
jar xf jpress-web-newest.war
6、浏览器直接访问::http://192.168.88.66/install 进入jpress安装向导
虽然,Tomcat已经打开了自动解压缩war包的功能,但是细心的同学会发现我并没有 重启Tomcat服务,
因此,war包并没有被自动解压缩。故,我们需要通过jar命令进行 解压缩,命令的参数和tar是一样的
==============================================================================================
============ Tomcat优化 --- 负载:说的只有CPU
==============================================================================================
1、telnet管理端口保护,将默认的管理端口修改-最好是将整个管理端口禁用掉
22 <Server port="8005" shutdown="SHUTDOWN">
#表示通过8005端口来接受SHUTDOW N,用来停止Tomcat进程。默认的方式是非常危险的。需要进行修改
Tomcat默认通过8005端口来接收SHUTDOWN这个字符串来关闭Tomcat进程,
但这是非常危险的,因此需要修改端口号来防护。否则,通过telnet命令即可强行关闭Tomcat 进程
2、将原生的 ROOT 也就是没用的文件删除。
cd /usr/local/tomcat/webapps/
#有 、很多多余的东西,只留下ROOT目录,其他都删掉或者mv移走
ls ROOT/
#很多多余的东西,因此清空本目录,或者都移 走
3、将 AJP 端口禁用,也就是:不要的端口都禁用掉,加强系统的安全性。
91 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
#这是AJP协议打开的端口,我们并不需要开启这个端口,因此注释掉本行
4、自定义webapps的目录,也就是:将tomcat中所有默认的信息全部修改掉。
在 Host 标签中添加,重新制定web的根目录
4-1、server.xml 文件中限制web站点的根目录路径,path表示此web应用程序的url的前缀,这样请求的url为 : http://localhost:8080/path/****
125 <Context path="" docBase="/usr/local/tomcat/webapps/memtest"
126 debug="0" reloadable="false" crossContext="true" />
提示:运行的java的war包,就需要放到 docBase 中才能够被tomcat识别。
5、降权,使用普通用户启动: tomcat 服务
降权的原则就是利用普通用户来启动Tomcat
(1)将Tomcat程序目录拷贝到普通用户家目录下
(2)修改家目录下程序的配置文件(启动端口,检测端口等),并重新指定网页根目录 路径。
(3)递归授权拷贝后的Tomcat程序的属主属组为普通用户。
(4)用su命令切换为普通用户,启动Tomcat进程
(5)此时Tomcat进程的权限为普通用户权限
(6)如果利用/etc/rc.local文件配置普通用户程序的开机启动,那么需要利用su -c临时 切换身份启动。具体可参考linux基础教案里的用户管理部分
====================================================================================================
性能优化:
1、屏蔽DNS查询 enableLookups="false"
#默认没有,需添加配置文件如下代码段,在Connector标签位置。表示禁止DNS查询
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" />
2、 jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加在脚本的最开始,声明位置。不要放在后边
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server-Xms1 024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m XX:MaxPermSize=512m"
#代码说明:
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是 128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G 物理内存,再吃尽一个G的swap
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
==========================================================================================================
==========================================================================================================
:Linux下java/http进程高解决案例
问题分析:
(1)程序属于CPU密集型,和开发沟通过,排除此类情况
(2)程序代码有问题,出现死循环,可能性极大
问题解决:
(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查
操作步骤:
(1)首先查找进程高的PID号(先找到是哪个PID号的进程导致的)
top -H
(2)查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)
strace -p 进程的PID
(3)如果是Web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)
printf "%x\n" 线程的PID --->#将有问题的线程的PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30 #过滤出有问题的线程的堆栈信息,找出问题代码块
实际操作演示:
1、pgrep -l java #java进程及对应PID号
2、strace -p 2031 #查看PID号为2031的java进程的所有线程调用情况
3、printf "%x\n" 2032 #将线程的PID号2032转换成十六进制格式
4、jstack 2031 | grep 7f0 -A 30 #追踪进称号为2031的进程的所有线程调用,从里面过滤出16进制为7f0的线程的代码调用情况
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl. java:409) #圆括号里显示的是(代码类名:具体调用的代码行号
=====================
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,
如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的 这种方式: jstack [-l] pid
(2)命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
1)、options:
executable Java executable from which the core dump was produced.
(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件 remote-hostname-or-IP 远程debug服务的主机名或ip server-id 唯一id,假如一台主机上多个远程debug服务
2)、基本参数:
-F:当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l:长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m:打印java和native c/c++框架的所有栈信息.
-h | -help:打印帮助信息
pid :需要被打印配置信息的java进程id,可以用jps查询.
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/
ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk
2、添加java环境变量
sed -i '$a export JAVA_HOME=/usr/local/jdk' /etc/profile
sed -i '$a export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH' /etc/profile
sed -i '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
关于上面那个sed命令的说明:sed -i.ori :-i表示对文件本身操作,
.ori表示修改的同时备份源文件表示文件内容的最后一行,
a表示在下面进行数据插入
\n :表示插入数据时换行
3、查看java正确安装
which java #有安装目录
java -version #有java信息输出
4、解压tomcat
tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
5、添加tomcat环境变量
echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile
source /etc/profile
6、修改tomcat中目录权限 #修改俩处
chown -R root.root /usr/local/jdk/ /usr/local/tomcat/
6-1、tomcat目录结构
[root@localhost tomcat]# tree -L 1
.
├── bin #用以启动,关闭Tomcat或者其他功能的脚本(.bat文件和.sh文件)
├── conf #用以配置Tomcat的XML及DTD文件
├── lib #存放web应用能访问的JAR包
├── LICENSE
├── logs #Catalina和其他Web应用程序的日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp #临时文件
├── webapps #Web应用程序根目录
└── work #用以产生有JSP编译出的Servlet的.java和.class文件
7 directories, 4 files
7、tomcat启动与关闭:
启动程序:/usr/local/tomcat/bin/startup.sh
关闭程序:/usr/local/tomcat/bin/shutdown.sh
7-1、正确启动输出的信息
[root@data-01 webapps]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
7-2、测试访问
[root@data-01 webapps]# curl -I http://localhost:8080
HTTP/1.1 200 OK #200 表示请求成功
netstat -antup | grep java #查看java进程 有3个
8、tomcat配置文件目录
cd /usr/local/tomcat/conf/
server.xml #主配置文件
tomcat-users.xml #Tomcat管理用户配置文件
8-1、修改tomcat管理配置文件---默认是禁用的。推荐禁用--优化之一禁用管理界面。
在<tomcat-users>标签内添加,这个标签在配置文件最后
<role rolename="manager-gui"/> #加入此行
<role rolename="admin-gui"/> #加入此行
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #加入此行
9、重启---重启后即可登录到管理界面
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
10、测试访问--登录到管理界面
http://192.168.88.66:8080/manager/status
提示输入用户及密码 上:8-1 设置的username、password
========================================================
========tomcat多实例操作:多实例出2个,共3个实例。
========================================================
1、拷贝/usr/local/下的tomcat源码包
cd /usr/local/
cp -a apache-tomcat-8.0.27 tomcat8_1
cp -a apache-tomcat-8.0.27 tomcat8_2
2、创建多实例的网页根目录
mkdir -p /data/www/www/ROOT
3、修改对应实例目录下的配置文件 server.html 中的端口以及网页根目录路径
<Server port="8011" shutdown="SHUTDOWN">
<Connector port="8081" protocol="HTTP/1.1"
<Host name="localhost" appBase="/data/www/www"
123 <Host name="localhost" appBase="webapps"
124 unpackWARs="true" autoDeploy="true">
125 <Context path="" docBase="/data/www/www"
126 debug="0" reloadable="false" crossContext="true" />
4、启动多实例tomcat
/usr/local/tomcat8_1/bin/startup.sh #启动第一个实例
/usr/local/tomcat8_2/bin/startup.sh #启动第二个实例
5、查看对应的端口是否启用
netstat -antup | grep java
========================================================================================
6、Nginx+Tomcat反向代理集群
6-1、修改Nginx配置文件,添加upstream模块对应实例中的tomcat实例;
upstream web_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
6-2、location匹配中: 添加
proxy_pass http://web_pools;
========================================================================================
一、maven搭建:
1、tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
2、ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
tail -2 /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
source /etc/profile
mvn -version #查询版本
Java环境变量配置:
JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
安装jenkins后“可选插件”列表为空
解决方案
选择插件管理-高级-升级站点-更改URL为
[http://mirror.xmission.com/jenkins/updates/update-center.json]-点击提交即可
=========================================================================================
二、使用Tomcat安装Jpress,类似于wordpress个人博客。
1、解压:apache-maven
tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/
ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven
2、添加环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/maven
export PATH="$MAVEN_HOME/bin:$PATH"
source /etc/profile
3、检测是否安装成功
mvn -version #出现这个表示成功
4、将jpress的war拷贝到tomcat的根目录下
ls -l jpress-web-newest.war
mv jpress-web-newest.war /data/www/www/ROOT/
5、解压jpress的war包
cd /data/www/www/ROOT/
jar xf jpress-web-newest.war
6、浏览器直接访问::http://192.168.88.66/install 进入jpress安装向导
虽然,Tomcat已经打开了自动解压缩war包的功能,但是细心的同学会发现我并没有 重启Tomcat服务,
因此,war包并没有被自动解压缩。故,我们需要通过jar命令进行 解压缩,命令的参数和tar是一样的
==============================================================================================
============ Tomcat优化 --- 负载:说的只有CPU
==============================================================================================
1、telnet管理端口保护,将默认的管理端口修改-最好是将整个管理端口禁用掉
22 <Server port="8005" shutdown="SHUTDOWN">
#表示通过8005端口来接受SHUTDOW N,用来停止Tomcat进程。默认的方式是非常危险的。需要进行修改
Tomcat默认通过8005端口来接收SHUTDOWN这个字符串来关闭Tomcat进程,
但这是非常危险的,因此需要修改端口号来防护。否则,通过telnet命令即可强行关闭Tomcat 进程
2、将原生的 ROOT 也就是没用的文件删除。
cd /usr/local/tomcat/webapps/
#有 、很多多余的东西,只留下ROOT目录,其他都删掉或者mv移走
ls ROOT/
#很多多余的东西,因此清空本目录,或者都移 走
3、将 AJP 端口禁用,也就是:不要的端口都禁用掉,加强系统的安全性。
91 <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
#这是AJP协议打开的端口,我们并不需要开启这个端口,因此注释掉本行
4、自定义webapps的目录,也就是:将tomcat中所有默认的信息全部修改掉。
在 Host 标签中添加,重新制定web的根目录
4-1、server.xml 文件中限制web站点的根目录路径,path表示此web应用程序的url的前缀,这样请求的url为 : http://localhost:8080/path/****
125 <Context path="" docBase="/usr/local/tomcat/webapps/memtest"
126 debug="0" reloadable="false" crossContext="true" />
提示:运行的java的war包,就需要放到 docBase 中才能够被tomcat识别。
5、降权,使用普通用户启动: tomcat 服务
降权的原则就是利用普通用户来启动Tomcat
(1)将Tomcat程序目录拷贝到普通用户家目录下
(2)修改家目录下程序的配置文件(启动端口,检测端口等),并重新指定网页根目录 路径。
(3)递归授权拷贝后的Tomcat程序的属主属组为普通用户。
(4)用su命令切换为普通用户,启动Tomcat进程
(5)此时Tomcat进程的权限为普通用户权限
(6)如果利用/etc/rc.local文件配置普通用户程序的开机启动,那么需要利用su -c临时 切换身份启动。具体可参考linux基础教案里的用户管理部分
====================================================================================================
性能优化:
1、屏蔽DNS查询 enableLookups="false"
#默认没有,需添加配置文件如下代码段,在Connector标签位置。表示禁止DNS查询
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" />
2、 jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加在脚本的最开始,声明位置。不要放在后边
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server-Xms1 024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m XX:MaxPermSize=512m"
#代码说明:
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是 128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G 物理内存,再吃尽一个G的swap
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间
==========================================================================================================
==========================================================================================================
:Linux下java/http进程高解决案例
问题分析:
(1)程序属于CPU密集型,和开发沟通过,排除此类情况
(2)程序代码有问题,出现死循环,可能性极大
问题解决:
(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查
操作步骤:
(1)首先查找进程高的PID号(先找到是哪个PID号的进程导致的)
top -H
(2)查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)
strace -p 进程的PID
(3)如果是Web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)
printf "%x\n" 线程的PID --->#将有问题的线程的PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30 #过滤出有问题的线程的堆栈信息,找出问题代码块
实际操作演示:
1、pgrep -l java #java进程及对应PID号
2、strace -p 2031 #查看PID号为2031的java进程的所有线程调用情况
3、printf "%x\n" 2032 #将线程的PID号2032转换成十六进制格式
4、jstack 2031 | grep 7f0 -A 30 #追踪进称号为2031的进程的所有线程调用,从里面过滤出16进制为7f0的线程的代码调用情况
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl. java:409) #圆括号里显示的是(代码类名:具体调用的代码行号
=====================
jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,
如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的 这种方式: jstack [-l] pid
(2)命令格式
jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP
1)、options:
executable Java executable from which the core dump was produced.
(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件 remote-hostname-or-IP 远程debug服务的主机名或ip server-id 唯一id,假如一台主机上多个远程debug服务
2)、基本参数:
-F:当’jstack [-l] pid’没有相应的时候强制打印栈信息
-l:长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m:打印java和native c/c++框架的所有栈信息.
-h | -help:打印帮助信息
pid :需要被打印配置信息的java进程id,可以用jps查询.