An OutOfMemoryError
xảy ra khi vùng heap không có đủ bộ nhớ để tạo đối tượng mới. Nếu heap không có đủ bộ nhớ, thì đối tượng OutOfMemoryError
được tạo. Tôi đang cố gắng để hiểu điều này, xin vui lòng tư vấn cho.Đối tượng OutOfMemoryError được tạo ở đâu trong Java
Trả lời
Nó được tạo ra bởi JVM, không bị giới hạn bởi -Xmx hoặc các tham số khác. Heap dành cho chương trình của bạn đã hết, không phải bộ nhớ có sẵn cho JVM.
Tất nhiên, đây là hành vi phụ thuộc vào triển khai. HotSpot có một số bộ nhớ heap không thể truy cập được cho các phân bổ thông thường, JVM có thể sử dụng để xây dựng một OutOfMemoryError
. Tuy nhiên, vì Java cho phép một số chủ đề tùy ý, một số chủ đề tùy ý có thể va vào tường cùng một lúc, vì vậy không có bảo đảm rằng bộ nhớ đủ để xây dựng một cá thể OutOfMemoryError
riêng biệt cho mỗi bộ nhớ.
Vì vậy, trường hợp khẩn cấp OutOfMemoryError
được tạo khi khởi động JVM tồn tại trong suốt toàn bộ phiên, để đảm bảo rằng lỗi có thể được ném ngay cả khi không còn bộ nhớ. Vì cá thể sẽ được chia sẻ cho tất cả các chuỗi gặp phải lỗi trong khi thực sự không còn bộ nhớ, bạn sẽ nhận ra tình trạng không liên quan này do thực tế là lỗi này sẽ không có dấu vết ngăn xếp.
Chương trình sau
ConcurrentHashMap<OutOfMemoryError,Integer> instances = new ConcurrentHashMap<>();
ExecutorService executor = Executors.newCachedThreadPool();
executor.invokeAll(Collections.nCopies(1000,() -> {
ArrayList<Object> list = new ArrayList<>();
for(;;) try {
list.add(new int[10_000_000]);
} catch(OutOfMemoryError err) {
instances.merge(err, 1, Integer::sum);
return err;
}
}));
executor.shutdown();
System.out.println(instances.size()+" distinct errors created");
instances.forEach((err,count) -> {
StackTraceElement[] trace = err.getStackTrace();
System.out.println(err.getClass().getName()+"@"+Integer.toHexString(err.hashCode())
+(trace!=null&&trace.length!=0? " has": " has no")+" stacktrace, used "+count+'x');
});
chạy dưới jdk1.8.0_65
với -Xmx100M
và chờ đợi một nửa phút đã cho tôi
5 distinct errors created
[email protected] has no stacktrace, used 996x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
[email protected] has stacktrace, used 1x
cho thấy bộ nhớ dành riêng có thể phục vụ cho việc xây dựng bốn biệt OutOfMemoryError
trường (bao gồm cả bộ nhớ cần thiết để ghi lại dấu vết ngăn xếp của chúng) trong khi tất cả các luồng khác phải quay trở lại phiên bản được chia sẻ dành riêng.
Tất nhiên, các con số có thể khác nhau giữa các môi trường khác nhau.
rất thú vị, tôi không biết gì về điều này – Eugene
- 1. Đối tượng được ném trong C++ ở đâu?
- 2. Đối tượng trả về được lưu trữ ở đâu?
- 3. Đối tượng tạm thời được lưu trữ ở đâu?
- 4. Enum của Java ... Chúng được tạo ra ở đâu?
- 5. Công cụ tạo mã Java được sử dụng ở đâu?
- 6. Các lớp java được lưu trữ trong Oracle ở đâu?
- 7. java outOfMemoryError với trình tạo chuỗi
- 8. Các đối tượng Grails Command nên được đặt trong cấu trúc dự án ở đâu?
- 9. Các chức năng của đối tượng được lưu trữ trong bộ nhớ ở đâu?
- 10. Biến cá thể riêng của một lớp trừu tượng được tạo trong heap ở đâu?
- 11. Cách tạo đối tượng Java trong Clojure
- 12. Toán tử == được định nghĩa trong lớp "đối tượng" ở đâu?
- 13. Tôi có thể tìm tất cả các đối tượng COM có thể được tạo trong Powershell ở đâu?
- 14. Java tìm tệp ở đâu?
- 15. Biểu tượng gcov ở đâu?
- 16. Đa giác trong Java ở đâu?
- 17. Tệp được gắn ở đâu?
- 18. Java: chuỗi khởi tạo của đối tượng
- 19. Các đối tượng mô tả thuộc tính được lưu trữ ở đâu?
- 20. Thành viên không tĩnh của một đối tượng tĩnh được phân bổ ở đâu?
- 21. Các tệp JSP Java (* __ jsp.java) được biên dịch ở đâu?
- 22. Các chức năng thành viên được lưu trữ cho một đối tượng ở đâu?
- 23. Java: Exception OutOfMemoryError và freeMemory()
- 24. ở đâu "null" trong bộ nhớ
- 25. Hibernate, SessionFactoryObjectFactory và OutOfMemoryError: không gian java heap
- 26. Mã băm của đối tượng được lưu trữ ở đâu nếu khóa thiên vị được bật trong HotSpot JVM?
- 27. Vars được lưu trữ ở đâu trong Nodej?
- 28. Tạo đối tượng sử dụng từ khóa tĩnh trong Java
- 29. Từ khóa được định nghĩa trong Ruby ở đâu?
- 30. Các gói SSIS được lưu ở đâu?
câu hỏi phỏng vấn tuyệt vời IMO - nhưng tôi đã thất bại. cảm ơn bạn đã đăng nó – Eugene