Java 逃避分析怀疑
我想我应该用escape分析(Java8,64位服务器JVM)做一个小实验。我提出了一个非常愚蠢的“应用程序”,我在其中创建了很多Address对象(它们包括一个邮政编码、街道、国家和对象生成的时间戳。此外,Address有一个isOk()方法,如果时间戳可以被7整除,则返回true…) 下面是节目:Java 逃避分析怀疑,java,jvm,escape-analysis,Java,Jvm,Escape Analysis,我想我应该用escape分析(Java8,64位服务器JVM)做一个小实验。我提出了一个非常愚蠢的“应用程序”,我在其中创建了很多Address对象(它们包括一个邮政编码、街道、国家和对象生成的时间戳。此外,Address有一个isOk()方法,如果时间戳可以被7整除,则返回true…) 下面是节目: private boolean generate() { boolean valid = true; for (int i=0;i<1_000_000_000;i++) {
private boolean generate() {
boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
valid = valid && doGenerate();
}
return valid;
}
private boolean doGenerate() {
long timeGenerated = System.currentTimeMillis();
Address address = new Address(1021, "A Street", "A country", timeGenerated);
return address.isOk();
}
private boolean generate(){
布尔有效=真;
对于(int i=0;i您编写了“如果时间戳可被7整除,则返回true”。这应该可以清楚地说明发生了什么。在您的第一个代码中:
boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
valid = valid && doGenerate();
}
return valid;
valid
也将变为并保持false
,只要时间戳恰好不能被7
整除,但唯一短路的是调用isOk()
。不管valid
的值是多少,构造都会发生
原则上,地址
的构造可以在这里消除,但这需要堆栈上的替换,因为它必须在循环运行时发生。现在还不清楚这是否是问题所在,但更重要的结论是,在这两种情况下,我们都没有看到EA发生,就像在第一种情况下一样,您没有调用met包含分配的hod(在未知但预期的少量调用之后)
因此,这两个例子是不等价的,不允许得出关于逃逸分析的结论。BTWif(!doGenerate()){return false;}
会更快。当然,从逻辑的角度来看,整个过程没有任何意义。这个应用程序的目的是给我一些时间来观察堆的内容是如何变化的。
boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
valid = valid && doGenerate();
}
return valid;
boolean valid = true;
for (int i=0;i<1_000_000_000;i++) {
long timeGenerated = System.currentTimeMillis();
Address address = new Address(1021, "A Street", "A country", timeGenerated);
valid = valid && address.isOk();
}
return valid;