Không có gì ngạc nhiên khi nó đang xảy ra sai. Bạn có kích thước ngăn xếp là 128Mb cho mỗi luồng, nhưng chỉ có 4096Mb tổng thể. Điều đó cung cấp cho bạn chỉ đủ không gian để sử dụng 40 luồng và sau đó không có bất kỳ đối tượng nào trong heap.
Có lẽ tốt nhất là bỏ ghi chú tất cả các kích thước không gian và để JVM tự động thực hiện công việc của nó.