想跑出StackOverFlow说容易不容易,说难也不难。
StackOverFlow主要是因为线程私有的java虚拟机栈已达到分配大小,不可再分配
一般情况下,首先内存不够用的都是堆而并非java虚拟机栈。
为观察到StackOverflowError,必须限制java虚拟机栈尽可能小。以下代码实例:
//java -Xms2G -Xss1k RecursiveTest
import java.security.SecureRandom;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class RecursiveTest {
public static void main(String[] args) {
int[] testArr = new int[1000_0086];
Random random = new SecureRandom();
for(int i=0 ; i<testArr.length; i++){
testArr[i] = random.nextInt();
}
System.out.println("step1");
List<Integer> list = IntStream.of(testArr).parallel().boxed().collect(Collectors.toList());
System.out.println("step2");
System.out.println(findMax(list));
}
public static int findMax(List<Integer> arr){
if(1 == arr.size()){
return arr.get(0);
}else if(2 == arr.size()){
return Math.max(arr.get(0), arr.get(1));
}
return Math.max(arr.get(0),findMax(arr.subList(1, arr.size())));
}
}