JVM最大内存32,再大的话就开始性能不好了
tomcat 优化 1内存分配,2 垃圾回收机制 3 线程之类的
目录
编译 java 程序 Jpress #目前 v5.02不支持JDK11
[root@ubuntu2004 ~]#cat Heap.java
public class Heap {
public static void main(String[] args){
//返回虚拟机试图使用的最大内存,字节单位
long max = Runtime.getRuntime().maxMemory();
//返回JVM初始化总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB");
}
}
[root@ubuntu2004 ~]#javac Heap.java #解析查看内存
[root@ubuntu2004 ~]#java Heap #执行
max=513802240字节 490.0MB
total=33554432字节 32.0MB[root@ubuntu2004 ~]#java -XX:+PrintGCDetails Heap #详细版查看
[0.001s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.
[0.003s][info ][gc,heap] Heap region size: 1M
[0.005s][info ][gc ] Using G1
[0.005s][info ][gc,heap,coops] Heap address: 0x00000000e1600000, size: 490 MB, Compressed Oops mode: 32-bit
max=513802240字节 490.0MB
total=33554432字节 32.0MB
[0.088s][info ][gc,heap,exit ] Heap
[0.088s][info ][gc,heap,exit ] garbage-first heap total 32768K, used 1024K [0x00000000e1600000, 0x0000000100000000)
[0.088s][info ][gc,heap,exit ] region size 1024K, 2 young (2048K), 0 survivors (0K)
[0.088s][info ][gc,heap,exit ] Metaspace used 4792K, capacity 4842K, committed 5120K, reserved 1056768K
[0.088s][info ][gc,heap,exit ] class space used 406K, capacity 424K, committed 512K, reserved 1048576K
#指定内存空间
[root@centos8 ~]#java -Xms1024m -Xmx1024m -XX:+PrintGCDetails Heap
max=1037959168字节 989.875MB
total=1037959168字节 989.875MB
JVM 内存常用相关参数
- JVM是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。所以,JAVA虚拟机JVM是属于JRE的,而现在我们安装JDK时也附带安装了JRE(当然也可以单独安装JRE)。
Java 命令行参考文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
选项分类
- -选项名称 此为标准选项,所有HotSpot都支持
- -X选项名称 此为稳定的非标准选项
- -XX:选项名称 非标准的不稳定选项,下一个版本可能会取消
#指定内存空间
[root@centos8 ~]#java -Xms1024m -Xmx1024m -XX:+PrintGCDetails Heap
max=1037959168字节 989.875MB
total=1037959168字节 989.875MB
vim /usr/local/apache-tomcat-9.0.65/bin/catalina.sh
# -----------------------------------------------------------------------------
JAVA_OPTS="-Xms1024m -Xmx1024m" #页面往下返需要在这里加上加上这一行
# OS specific support. $var _must_ be set to either true or false.
cygwin=false
darwin=false
os400=false
[root@ubuntu2004 ~]#systemctl restart tomcat.service 重启
[root@ubuntu2004 ~]#ps aux |grep tomcat #查看
垃圾收集方式
按工作模式不同:指的是GC线程和工作线程是否一起运行
- 独占垃圾回收器:只有GC在工作,STW 一直进行到回收完毕,工作线程才能继续执行
- 并发垃圾回收器:让GC线程垃圾回收某些阶段可以和工作线程一起进行,如:标记阶段并行,回收阶段
仍然串行
- 按回收线程数:指的是GC线程是否串行或并行执行
- 串行垃圾回收器:一个GC线程完成回收工作
- 并行垃圾回收器:多个GC线程同时一起完成回收工作,充分利用CPU资源
垃圾回收器
按分代设置不同垃圾回收器
新生代串行收集器Serial:单线程、独占式串行,采用复制算法,简单高效但会造成STW
新生代并行回收收集器PS(Parallel Scavenge):多线程并行、独占式,会产生STW, 使用复制算法
关注调整吞吐量,此收集器关注点是达到一个可控制的吞吐量
Parallel Scavenge
吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间),比如虚拟机总共运行100分
钟,其中垃圾回收花掉1分钟,那吞吐量就是99%。
十分钟需要1分钟来清理,这一分钟集中在一起
ParNew
新生代并行收集器ParNew:就是Serial 收集器的多线程版,将单线程的串行收集器变成了多线程并
行、独占式,使用复制算法,相当于PS的改进版。
分钟需要1分钟来清理,这一分钟拆成一秒间断清理·
垃圾收集器设置
优化调整Java 相关参数的目标: 尽量减少FullGC和STW
通过以下选项可以单独指定新生代、老年代的垃圾收集器
- -server 指定为Server模式,也是默认值,一般使用此工作模式
- -XX:+UseSerialGC
- 运行在Client模式下,新生代是Serial, 老年代使用SerialOld
-XX:+UseParNewGC
- 新生代使用ParNew,老年代使用SerialOld
-XX:+UseParallelGC
- 运行于server模式下,新生代使用Parallel Scavenge, 老年代使用 Parallel Old
-XX:+UseParallelOldGC
- 新生代使 用Paralell Scavenge, 老年代使用Paralell Old,和上面-XX:+UseParallelGC 相同
- -XX:ParallelGCThreads=N,在关注吞吐量的场景使用此选项增加并行线程数
-XX:+UseConcMarkSweepGC
- 新生代使用ParNew, 老年代优先使用CMS,备选方式为Serial Old
- 响应时间要短,停顿短使用这个垃圾收集器
- -XX:CMSInitiatingOccupancyFraction=N,N为0-100整数表示达到老年代的大小的百分比多
- 少触发回收默认68
- -XX:+UseCMSCompactAtFullCollection 开启此值,在CMS收集后,进行内存碎片整理
- -XX:CMSFullGCsBeforeCompaction=N 设定多少次CMS后,进行一次内存碎片整理
- -XX:+CMSParallelRemarkEnabled 降低标记停顿
范例:
[root@ubuntu2004 ~]#vim /usr/local/tomcat/bin/catalina.sh
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5
10224后面
jconsole 和 JMX (远程连接)
图形化工具,可以用来查看Java进程信息
MX(Java Management Extensions,即Java管理扩展)是一个为JAVA应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览。
#为Java程序开启JMX很简单,只要在运行Java程序的命令后面指定如下命令即可
java \
-Dcom.sun.management.jmxremote \ #启用远程监控JMX
-Djava.rmi.server.hostname=10.0.0.100 \ #指定自已监听的IP
-Dcom.sun.management.jmxremote.port=12345 \ #指定监听的PORT
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar app.jar|app.war
和前面操作一样
线程池调整
[root@centos8 ~]#vim /usr/local/tomcat/conf/server.xml
......
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" maxThreads="2000"/>
.....
常用属性
- connectionTimeout :连接超时时长,单位ms
- maxThreads:最大线程数,默认200
- minSpareThreads:最小空闲线程数
- maxSpareThreads:最大空闲线程数
- acceptCount:当启动线程满了之后,等待队列的最大长度,默认100
- URIEncoding:URI 地址编码格式,建议使用 UTF-8
- enableLookups:是否启用客户端主机名的DNS反向解析,缺省禁用,建议禁用,就使用客户端IP就行
- compression:是否启用传输压缩机制,建议 "on",CPU和流量的平衡
- compressionMinSize:启用压缩传输的数据流最小值,单位是字节
- compressableMimeType:定义启用压缩功能的MIME类型text/html, text/xml, text/css,
- text/javascript
maven 部署准备
- 导入包
- [root@ubuntu2004 ~]#tar -xf apache-maven-3.8.6-bin.tar.gz -C /usr/local/
- [root@ubuntu2004 ~]#cd /usr/local/
- [root@ubuntu2004 local]#ln -s apache-maven-3.8.6/ maven
- [root@ubuntu2004 local]#echo 'PATH=/usr/local/maven/bin:$PATH' > /etc/profile.d/maven.sh
- [root@ubuntu2004 local]#. /etc/profile.d/maven.sh
- [root@ubuntu2004 local]#mvn -version
Apache Maven 3.8.6 (84538c9988a25aec085021c365c560670ad80f63)
git clone https://gitee.com/lbtooth/spring-boot-helloWorld.git 网上拉取
[root@ubuntu2004 ~]#cd spring-boot-helloWorld/ 打开
[root@ubuntu2004 spring-boot-helloWorld]#mvn clean package -Dmaven.test.skip=true 编译
[root@ubuntu2004 opt]#java -jar spring-boot-helloworld-0.9.0-SNAPSHOT.jar --server.port=8181
编译运行 指定端口(可以不加)
vim spring-boot-helloWorld/src/main/java/com/neo/controller/HelloWorldController.java
#可以在这里把0.9那个版本号改一下,重新编译执行 就可以出来新的
编译 java 程序 Jpress #目前 v5.02不支持JDK11
#下载源码
[root@rocky8 ~]#git clone https://gitee.com/JPressProjects/jpress.git
#或者
[root@rocky8 ~]#wget wget -O jpress-v4.2.0.tar.gz
'https://gitee.com/JPressProjects/jpress/repository/archive/v4.2.0?
format=tar.gz'[root@ubuntu2004 jpress]#pwd
/root/jpress
[root@ubuntu2004 jpress]#mvn clean install package -Dmaven.test.skip=true #编译
[root@ubuntu2004 jpress]#cp starter-tomcat/target/starter-tomcat-5.0.war /usr/local/tomcat/webapps/jpress.war #移到这里可以让网页访问
#安装JDK
[root@ubuntu1804 ~]#apt install openjdk-8-jdk -y
[root@ubuntu1804 ~]#java -version
#可能需要科学上网下载
[root@ubuntu1804 ~]#wget https://download.sonatype.com/nexus/3/nexus-3.29.2-02-
unix.tar.gz
[root@ubuntu1804 ~]#ll -h nexus-3.29.2-02-unix.tar.gz
[root@ubuntu2004 ~]#tar xf nexus-3.41.1-01-unix.tar.gz -C /usr/local/[root@ubuntu2004 ~]
#cd /usr/local/
[root@ubuntu2004 local]#ln -s nexus-3.41.1-01/ nexus #创建软裂解
#指定运行身份
[root@ubuntu1804 ~]#vim /usr/local/nexus/bin/nexus.rc
run_as_user="root"
[root@ubuntu2004 local]#cat /lib/systemd/system/nexus.service #创建管理文件把它写进去
[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/usr/local/nexus/bin/nexus start
ExecStop=/usr/local/nexus/bin/nexus stop
User=root
#User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target
[root@ubuntu2004 local]#systemctl daemon-reload
[root@ubuntu2004 local]#systemctl enable --now nexus.service 就可以了
Maven的仓库优化配置
默认仓库maven-central使用国外仓库地址,可修改为如下的国内镜像地址进行加速
左上角 点击Sign in
[root@ubuntu2004 local]#cat /usr/local/sonatype-work/nexus3/admin.password
693f11d1-5198-499f-8827-d1657cceb217 #cat查看给出的路径密码
可以修改为国内镜像,参考阿里云以下说明
把这里改成自己想要的