當您從長代碼片斷中提取方法時,通常會遇到基元變量的值調用問題。您不能在提取的方法中更改這些原始參數,以便調用者看到更改。 您可以通過使primitive變量只有一個元素的數組來避免這種情況。然後它被有效地用於通過引用來調用。然而,它現在是堆上的一個對象。 Java的逃逸分析是否足夠聰明以理解並儘可能地使用堆棧?
考慮下面的代碼,它不能被內聯的情況下:
public class EscapeAnalysisTest {
public static void main(String[] args) {
final Set<Integer> integers = new HashSet<>();
integers.add(1);
integers.add(9);
integers.add(8);
integers.add(4);
// and so on ...
final long[] product = new long[1];
final long[] sum = new long[1];
final long[] count = new long[1];
final int[] max = new int[1];
final int[] min = new int[1];
product[0] = 1L;
max[0] = Integer.MIN_VALUE;
min[0] = Integer.MAX_VALUE;
for (Integer i : integers) {
calcSomeValues(product, sum, count, max, min, i);
}
System.out.println("Product :" + product[0]);
System.out.println("Sum :" + sum[0]);
System.out.println("Count:" + count[0]);
System.out.println("Max:" + max[0]);
System.out.println("Min:" + min[0]);
}
private static void calcSomeValues(final long[] product, final long[] sum, final long[] count, final int[] max,
final int[] min, Integer i) {
product[0] *= i;
sum[0] += i;
count[0]++;
max[0] = Math.max(max[0], i);
min[0] = Math.min(min[0], i);
}
}
EA是一個實現細節,不僅取決於特定的JVM,還取決於JIT的特定版本和決策。您應該寫一個microbenchmark,啓用GC日誌記錄,看看它是否分配 – the8472
我看不到逃生分析出現在圖片中。如果你的'calcFactorial()'方法變熱了,它將被內聯。從那時起,不需要擔心任何方法調用,只需創建一個局部變量並進行更新即可。 – biziclop
我擔心這個例子會很簡單。 – mmirwaldt