Java 逃避分析怀疑

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++) {

我想我应该用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++) {
        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(在未知但预期的少量调用之后)


因此,这两个例子是不等价的,不允许得出关于逃逸分析的结论。

BTW
if(!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;