JVM参数及调优_jvm调优,开发这么久这些问题都不会

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

启动程序,模拟用户请求,每100毫秒钟创建1000线程,每个线程创建一个512kb的对象,最多100毫秒内同时存在1000线程,并发量1000/s,吞吐量6000/s,查看GC的情况。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

// 启动程序,模拟用户请求
// 每100毫秒钟创建1000线程,每个线程创建一个512kb的对象,最多100毫秒内同时存在1000线程,并发量1000/s,吞吐量6000/s,查看GC的情况
@SpringBootApplication
public class PerformanceApplication {
public static void main(String[] args) {
SpringApplication.run(PerformanceApplication.class, args);
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
new Thread(() -> {
for (int i = 0; i < 1000; i++) {
try {
// 不干活,专门512kb的小对象
byte[] temp = new byte[1024 * 512];
Thread.sleep(new Random().nextInt(100)); // 随机睡眠200毫秒秒以内
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}, 100, 100, TimeUnit.MILLISECONDS);
}
}

// 打包 mvn clean package
// 服务器上运行 performance-1.0.0.jar

pom.xml

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

com.study.chapter-3
performance
1.1.0

chapter-3
性能优化章节代码

org.springframework.boot spring-boot-starter-parent 2.0.6.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-maven-plugin

application.yml

server:
port: 8080

在这里插入图片描述

打包成jar,maven clean install;

(二)调优演示

① 虚拟机信息

4G内存双核 Centos7
在这里插入图片描述

② 配置环境 && 安装jdk环境
配置dns

在这里插入图片描述
安装阿里云仓库的yum

cd /etc/yum.repos.d/

wget http://mirrors.aliyun.com/repo/Centos-7.repo

mv CentOS-Base.repo CentOs-Base.repo.bak

mv Centos-7.repo CentOs-Base.repo

安装jdk

vi pro.sh

shell脚本内容

#!/bin/bash
SOFT_PATH=/opt/soft

if [ ! -d $SOFT_PATH ];then
mkdir $SOFT_PATH
else
echo “文件夹已经存在”
fi

yum install -y wget
#install jdk1.8
cd $SOFT_PATH
wget --no-cookies --no-check-certificate --header “Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie” “http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz”
tar -zxvf jdk* -C $SOFT_PATH
cd jdk*
JAVA_HOME=pwd

#install maven3.2.3
cd $SOFT_PATH
wget https://archive.apache.org/dist/maven/maven-3/3.2.3/binaries/apache-maven-3.2.3-bin.tar.gz
tar -zxvf apache-maven-3.2.3-bin.tar.gz -C $SOFT_PATH
mv apache-maven-3.2.3 maven-3.2.3
cd maven*
MAVEN_HOME=pwd

#install git 2.8.0
cd $SOFT_PATH
yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils- MakeMaker
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.0.tar.gz
tar -zxvf git-2.8.0.tar.gz -C $SOFT_PATH
cd git*
./configure
make install
ln -s /usr/local/bin/git /usr/bin/git

#追加环境变量
echo “export JAVA_HOME= J A V A H O M E " > > / e t c / p r o f i l e e c h o " e x p o r t P A T H = {JAVA_HOME}" >> /etc/profile echo "export PATH= JAVAHOME">>/etc/profileecho"exportPATH=”“JAVA_HOME/bin: " " P A T H " > > / e t c / p r o f i l e e c h o " e x p o r t M A V E N H O M E = ""PATH" >> /etc/profile echo "export MAVEN_HOME= ""PATH">>/etc/profileecho"exportMAVENHOME={MAVEN_HOME}” >> /etc/profile
echo “export PATH= " " M A V E N H O M E / b i n : ""MAVEN_HOME/bin: ""MAVENHOME/bin:”“PATH” >> /etc/profile
source /etc/profile
#输出信息
echo “-----source update-----”
echo “java version”
java -version
echo “maven version”
mvn -v
echo “-----path-----”
echo "JAVA_HOME:" J A V A H O M E e c h o " M A V E N H O M E : " JAVA_HOME echo "MAVEN_HOME:" JAVAHOMEecho"MAVENHOME:"MAVEN_HOME
source /etc/profile

设置权限,通过脚本的方式安装jdk,maven

chmod 777 pro.sh
./pro.sh
source /etc/profile

在这里插入图片描述
安装 lrzsz 方便通过crt上传jar包

yum -y install lrzsz

rz 上传jar包
在这里插入图片描述
② 启动jar包
设置1G的内存

java -Xmx1024m -jar performance-1.1.0.jar

在这里插入图片描述
jcmd查看正在运行的java程序
在这里插入图片描述

查看堆的使用情况,To Space中的used 是空的,因为总会有一个复制算法。使用率已经99%了。

查看堆的使用情况,To Space中的used 是空的,因为总会有一个复制算法。使用率已经99%了。

jmap -heap 19587

在这里插入图片描述
如何去调优呢?调优的思路是什么?
④ GC 调优思路
1.分析场景
例如:启动速度慢;偶尔出现响应慢于平均水平或者出现卡顿。

2.确定目标

内存占用,低延时(web程序),吞吐量。

3.收集日志

通过参数配置收集GC日志(事后分析,一步一卡卡的潇洒),通过JDK(jstat)工具查看GC状态。
4.分析日志

使用工具辅助分析日志,查看GC次数,GC时间。
5.调整参数

切换垃圾收集器或者调整垃圾收集器参数。

(三)通用GC参数

-XX:ParallelGCThreads 并行GC线程数量(并行搞个跟CPU的数量一样多没关系)
-XX:ConcGCThreads 并发GC线程数量(GC在操作,业务代码也在抢)
不能设置的GC线程数和应用的线程数一样,大家都是抢资源的,抢一抢都没了。

-XX:MaxGCPauseMillis=n,最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间,这个时间不能设置太大,如果设置10秒,就意味着程序10秒的时间程序都不在运行。本来停顿1秒,结果你设置1ms,GC也做不到,它只能尽量的调整新生代,老年代,survivior等的尽量靠拢你设置的时间。一般起不到什么大的效果。

-XX:GCTimeRatio:设置吞吐量大小,它的值是一个 0-100 之间的整数。假设 GCTimeRatio 的值为 n,那么系统将花费不超过 1/(1+n) 的时间用于垃圾收集。如果你设置99秒。1秒GC,但是99秒生成的数据量比较大,1秒的GC解决不完,其实也是白扯。一般起不到什么大的效果。

-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例,默认8,如果新生代有100m,survivior就有10m,Eden区是80m。这个作用不大,很多时候GC需要自适应。

-XX:NewRatio:新生代和老年代的比,默认4,新生代:老年代=1:4,新生代占五分之一。这个作用不大,很多时候GC需要自适应。

-verbose:gc 、-XX:+printGC 打印GC的简要信息。
-XX:+PrintGCDetails 打印GC详细信息。已经被舍弃。
-XX:+PrintGCTimeStamps 打印GC发生的时间戳。已经被舍弃。
-Xloggc:log/gc.log 指定GC log的位置,以文件输出。(不可能跟控制台一起打印的,都是以文件的形式存储)。
XX:+PrintHeapAtGC 每次一次GC后,都打印堆信息。

(四)事后打印gc日志分析gc

① 命令收集gc信息

java -Xmx1024m -Xloggc:gc1.log -jar performance-1.1.0.jar

在这里插入图片描述
② 查看日志发现很多full gc

more gc1.log

在这里插入图片描述
③ 工具的方式查看gc
下载gc1.log到本地

#下载到默认的下载目录,在crt有设置
sz gc1.log
在这里插入图片描述

GCViewer工具,辅助分析GC日志文件 https://github.com/chewiebug/GCViewer/wiki/Changelog
在这里插入图片描述

java -jar gcviewer-1.36-SNAPSHOT.jar

在这里插入图片描述
⑤ 加载gc日志文件
在这里插入图片描述
⑥ 分析gc文件结果

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
cess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTA3OTc3,size_16,color_FFFFFF,t_70)
⑥ 分析gc文件结果

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-eM8a97WH-1713327873942)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值