1. warm up会有什么影响?
·这也是我为什么要讲这个话题的原因。主要是因为我们经常自己写代码测试某些方法的性能(
基准测试),发现每次运行的时间都不一样,甚至方法的顺序,方法的大小,测试结果也可能会不一样。
·影响基准测试结果的因素有很多:比如硬件配置:单核,双核,内存大小;jvm机制:执行方式,堆管理(GC),hotspot优化策略,并发等。
·我们要尽量减少这些因素的干扰,其中warm up现象就是一个要避免的。
2. 那什么是warm up现象?
·中文说法--预热。为什么会有预热现象了?先说说jvm几种执行方式。
·jvm有四种执行方式:解释执行,编译执行,动态优化执行(自适应优化),芯片级直接执行。
·动态优化执行:虚拟机开始对所有代码都是解释运行,但是它会监视代码的执行情况,找出频繁执行的代码,然后编译成本地代码,同时采取一些策略优化编译后的代码。这个执行时编译的过程也叫动态编译或即时编译。
·sun hotspot jvm采用的就是动态编译方式(SUN的JDK版本从1.3.1开始运用HotSpot虚拟机)。
·那么解释执行代码,直到将程序编译成本地代码,这个过程可以理解为jvm warm up。
3. 怎么避免warm up带来的影响了?
·方法一:jvm参数设置
-XX:CompileThreshold=10000:参数意思:通过JIT编译器,将方法编译成机器码的阀值,可以理解为调用方法的次数。client模式默认1500,server模式默认10000。
有些资料建议指定为1,第一次运行的时候就编译成本地代码。这样会达到预期的效果吗?
我们先看几个例子:(我们通过参数 -XX:+PrintCompilation往stdout打印方法被JIT编译时的信息来观察JNI的过程)
public class WarmUpTest {
private static final int loop = 10000;
public static void main(String[] argv) {
List list = createList();
for (int i = 1; i < loop; i++) {
iteratorloop(list);
}
}
private static void iteratorloop(List list) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
}
}
private static List createList() {
List list = new ArrayList(1);
for (int i = 0; i < list.size(); i++) {
list.add(i);
}
return list;
}
}
A)XX:CompileThreshold=1;调用iteratorloop方法10000次,编译信息:
1 java.lang.Thread::<init> (49 bytes)
--- n java.lang.ClassLoader::findLoadedClass0
--- n java.lang.ClassLoader::findBootstrapClass
2 java.lang.Object::<init> (1 bytes)
3 java.lang.Thread::init (188 bytes)
--- n java.lang.ClassLoader$NativeLibrary::find
--- n java.security.AccessController::doPrivileged (static)
--- n java.security.AccessController::doPrivileged (static)
--- n java.io.WinNTFileSystem::getBooleanAttributes
4 java.lang.System::getSecurityManager (4 bytes)
5 java.lang.ThreadGroup::checkAccess (14 bytes)
6 ! java.lang.ThreadGroup::addUnstarted (40 bytes)
7 java.lang.String::toCharArray (20 bytes)
8 java.lang.String::getChars (66 bytes)
。。。。。
·输出了很多编译信息,但是并没有编译iteratorloop方法
B)XX:CompileThreshold=1;调用iteratorloop方法100000次,编译信息:
。。。。
344 com.china.my.java.WarmUpTest::main (23 bytes)
345 com.china.my.java.WarmUpTest::createList (40 bytes)
346 com.china.my.java.WarmUpTest::iteratorloop (27 bytes)
347 java.util.AbstractList::iterator (10 bytes)
。。。。
·编译了iteratorloop方法(第三行信息,只拷贝了一部分)
C)XX:CompileThreshold=1500;调用iteratorloop方法1499次,编译信息:
1 java.lang.Object::<init> (1 bytes)
2 java.lang.String::hashCode (60 bytes)
3 java.lang.String::charAt (33 bytes)
·只打印了三次编译信息,没有编译iteratorloop方法。
D)XX:CompileThreshold=1500;调用iteratorloop方法1500次,编译信息:
1 java.lang.Object::<init> (1 bytes)
2 java.lang.String::hashCode (60 bytes)
3 java.lang.String::charAt (33 bytes)
4 com.china.my.java.WarmUpTest::iteratorloop (27 bytes)
5 java.util.AbstractList::iterator (10 bytes)
6 java.util.AbstractList$Itr::<init> (6 bytes)
7 java.util.AbstractList$Itr::<init> (31 bytes)
8 java.util.AbstractList$Itr::hasNext (20 bytes)
·编译了iteratorloop方法(第四行信息)
【结论】
·CompileThreshold=1,遍历10000次后才可能发生编译;CompileThreshold=1500,编译的方法少,并且遍历1500次时,iteratorloop被编译执行了。
·jvm执行程序的时候,本身会调用很多方法(从打印出的编译信息可以看出),所以你想测试的方法不一定是执行频率最高的方法,这完全取决于jvm的hotspot策略。或者说CompileThreshold只是个先决条件,达到了这个值,不一定就会马上编译,虚拟机中会采取策略选择它所认为的当前hotspot编译成本地方法。
·方法二:先执行测试方法N次;然后在测试某方法执行时间。
·配合方法一:先预设CompileThreshold一个阀值,并通过PrintCompilation确认程序执行指定N次后会编译成本地代码。
{参考资料}
大方法的执行性能与调优过程小记
健壮的 Java 基准测试,第 1 部分: 问题
健壮的 Java 基准测试,第 2 部分: 统计和解决方案
Java 6中的线程优化真的有效么
分享到:
相关推荐
资源来自pypi官网。 资源全名:warmup_scheduler-0.3.tar.gz
首次访问sharepoint网站总是比较慢,该程序可以为sharepoint提供warm up功能,已经打包为WSP包,在Sharepoint的管理中心安装后,进行配置即可。
运行后附代码文件生成tf_serving_warmup_requests文件; 置其于模型保存文件夹内的assets.extra文件夹下; 重启docker API即可,可观察到屏幕输出显示warmp启动成功; 保存模型的文件结构于是乎成为: . ├── ...
2016年0ctf的pwn题。
$ pip install git+https://github.com/ildoonet/pytorch-gradual-warmup-lr.git 用法 请参阅文件。 import torch from torch . optim . lr_scheduler import StepLR , ExponentialLR from torch . optim . sgd ...
2016秋英语1练习:1.1 Warm-up & Lesson 1 A Perfect Day 含答案.docx
Unit3Warmup学习课程.pptx
构建它: mvn clean package将 target/warmup-1.0.jar 复制到 Neo4j 服务器的 plugins/ 目录中。 通过在 conf/neo4j-server.properties 中添加一行来配置 Neo4j: org.neo4j.server.thirdparty_jaxrs_classes=...
幼儿英语热身warmup PPT课件.pptx
幼儿英语热身warmup PPT学习教案.pptx
Warm up 英语热身课PPT教案学习.pptx
关于在项目工程中试用azure web app的时候,介绍如何使用warm up,warm up的概念,如何配置等相关流程及操作截图
资源来自pypi官网。 资源全名:warmup4ie-0.1.2.tar.gz
hybris Developer Training Part I - Core Platform - Module 01 - Warm Up
_高中英语Unit24SocietySectionⅠWarmup(1)-19页.pdf
2019_2020学年高中英语Unit22EnvironmentalProtectionSectionⅠWarmup&Lesson1_Comprehending知能演练轻松闯关北师大版选修8
电子科技大学第二十一届ACM程序设计竞赛-初赛 Warmup 题解.pdf
2019_2020学年高中英语Unit24SocietySectionⅠWarmup&Lesson1_Comprehending知能演练轻松闯关北师大版选修8
2019_2020学年高中英语Unit23ConflictSectionⅠWarmup&Lesson1_Comprehending知能演练轻松闯关北师大版选修8
2019_2020学年高中英语Unit20NewFrontiers1SectionⅠWarmup&Lesson1_Comprehending知能演练轻松闯关北师大版选修7