Vì bạn chưa chấp nhận bất kỳ câu trả lời nào, tôi cho rằng không ai trong số họ đã làm việc cho bạn. Đây là một trong đó sẽ. Nhưng trước tiên, xem xét lại các the conditions that trigger this error:
The parallel collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered
Vì vậy, bạn phải tiêu thụ hầu hết các heap, giữ cho nó được phân bổ, và sau đó phân bổ rất nhiều rác. Đặt rất nhiều thứ vào một Map
sẽ không làm điều này cho bạn.
public static void main(String[] argv)
throws Exception
{
List<Object> fixedData = consumeAvailableMemory();
while (true)
{
Object data = new byte[64 * 1024 - 1];
}
}
private static List<Object> consumeAvailableMemory()
throws Exception
{
LinkedList<Object> holder = new LinkedList<Object>();
while (true)
{
try
{
holder.add(new byte[128 * 1024]);
}
catch (OutOfMemoryError ex)
{
holder.removeLast();
return holder;
}
}
}
Phương thức consumeAvailableMemory()
lấp đầy đống với bộ nhớ tương đối nhỏ. "Tương đối nhỏ" là quan trọng bởi vì JVM sẽ đặt các đối tượng "lớn" (512k byte trong kinh nghiệm của tôi) trực tiếp vào thế hệ được thuê, để lại thế hệ trẻ trống rỗng.
Sau khi tôi đã tiêu thụ phần lớn vùng heap, tôi chỉ phân bổ và loại bỏ. Kích thước khối nhỏ hơn trong giai đoạn này là quan trọng: Tôi biết rằng tôi sẽ có đủ bộ nhớ cho ít nhất một phân bổ, nhưng có lẽ không quá hai. Điều này sẽ giữ cho GC hoạt động.
Chạy này tạo ra các lỗi mong muốn trong dưới một giây:
> java -Xms1024m -Xmx1024m GCOverheadTrigger
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at GCOverheadTrigger.main(GCOverheadTrigger.java:12)
Và, cho đầy đủ, đây là JVM mà tôi đang sử dụng:
> java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)
Và bây giờ câu hỏi của tôi dành cho bạn: tại sao bạn muốn làm điều này?
Lưu bản đồ vào bộ sưu tập khác được khai báo bên ngoài vòng lặp 'for' và thêm' while (true) 'trước vòng lặp' for' đầu tiên. –
Câu hỏi hay! Thật dễ dàng để tái tạo một "OOM heap", nhưng việc tái tạo giới hạn trên cao là MUCH phức tạp hơn ... Tôi tự hỏi liệu nó có khả thi không!(có mục đích, nghĩa là) – fge
Làm cho bên ngoài cho vòng lặp như trong khi (đúng) điều này là tái tạo lỗi. – VKPRO