Câu hỏi của tôi liên quan đến bộ nhớ trong java cho lớp mà không có thành viên dữ liệu. Giả sử trong java tôi có một lớp không có thành viên dữ liệu và nó chỉ chứa các phương thức. Vì vậy, nếu tôi đang tạo ví dụ của lớp học cụ thể thì nó chiếm bộ nhớ trong bộ nhớ chính ngoại trừ bộ nhớ tham chiếu đối tượng?Lớp học không có thành viên dữ liệu có dấu chân bộ nhớ trong java không?
Trả lời
Cuối cùng, mọi đối tượng Java đều biết lớp của nó và có một nguyên gốc đồng bộ hóa tùy chọn được đính kèm với nó (mặc dù this
có thể là tổng hợp). Đó là hai tài liệu tham khảo mà rất khó để làm cho một trường hợp java.lang.Object
làm mà không có. Mọi thứ khác bắt nguồn từ lớp đó, vì vậy bạn đã có một sàn cho các chi phí mà làm việc ra được ít nhất 8 bytes in Java 1.3.1. Một hồ sơ sẽ cho bạn biết chi phí hiện tại nếu bạn thực sự cần chúng.
Có, điều đó có, bởi vì ở mức tối thiểu, ngay cả đối tượng "trống" có con trỏ đến thông tin loại của nó.
Bạn nói đúng. Đó là lý do tại sao tôi đã đề cập trong câu hỏi ngoại trừ đối tượng tham chiếu/con trỏ. Vì vậy, ngoài tham chiếu/điểm nó có bất kỳ dấu chân bộ nhớ? –
Phụ thuộc vào việc triển khai JVM. Có khả năng sẽ có một số loại cơ chế đồng bộ cho mỗi đối tượng hoặc cờ đánh dấu cho bộ thu gom rác. Dự đoán tốt nhất của tôi sẽ có ít nhất 8 byte chi phí cho mỗi đối tượng trên máy 32 bit. –
Chi phí có thể lên đến 16 byte, cho một JVM 32 bit ... tùy thuộc vào chi tiết triển khai JVM. Các chi phí bao gồm kích thước đối tượng nguyên thủy, liên kết đến lớp, biểu diễn của mutex nguyên thủy, biểu diễn mã băm nhận dạng, cờ để hoàn thành và cứ tiếp tục như vậy. –
Hãy rõ ràng. Tất nhiên, tham chiếu đến đối tượng của bạn sẽ chiếm không gian. Nhưng đối tượng của bạn cũng sẽ chiếm không gian cho con trỏ 'this' của nó (tức là bạn có thể phân biệt các cá thể khác nhau) và cũng cho các trường của bất kỳ lớp cha nào - ví dụ: Object - và cuối cùng là bất cứ thứ gì mà cơ sở dữ liệu nội bộ của heap có.
nhớ Đo điểm chuẩn là khó khăn bởi vì các nguồn khác nhau của sự can thiệp (tăng heap, GC), nhưng nó vẫn còn giá trị một thử:
public static void main(String[] args)
{
final int n = 1000000;
final Runtime runtime = Runtime.getRuntime();
final Object[] objects = new Object[n];
final long memory0 = runtime.totalMemory() - runtime.freeMemory();
for (int i = 0; i < objects.length; i++)
{
objects[i] = new Object();
}
final long memory1 = runtime.totalMemory() - runtime.freeMemory();
final long memory = memory1 - memory0;
System.out.printf(
"%s %s\n",
System.getProperty("java.vm.name"),
System.getProperty("java.vm.version"));
System.out.printf("%d %d %.1f\n", n, memory, 1.0 * memory/n);
}
Java HotSpot (TM) Server VM 14,3-b01 1000000 8.000.336 8.0
+1 cho một thử nghiệm thực sự !! – mikera
- 1. Thành viên lớp học có chiếm được bộ nhớ không?
- 2. Lớp không có thành viên dữ liệu trong C++
- 3. một lớp học có thể có các thành viên dữ liệu ảo không?
- 4. Dấu chân bộ nhớ của các kiểu dữ liệu Haskell
- 5. Java chuyển đổi định dạng hình ảnh có dấu chân bộ nhớ thấp
- 6. Các thành viên tĩnh có giúp hiệu quả bộ nhớ không?
- 7. Thành viên lớp học Python Khởi tạo
- 8. Thành viên lớp học "tĩnh"
- 9. Python: Cách ước tính/tính toán dấu chân bộ nhớ của cấu trúc dữ liệu?
- 10. Thành viên lớp học chung trong C#?
- 11. Trong Java, các thành viên lớp tĩnh có được chia sẻ giữa các chương trình không?
- 12. Dấu chân bộ nhớ đối tượng Java - Visualvm và java.sizeOf đo lường
- 13. Ghi lại dấu chân bộ nhớ trong Linux
- 14. Các lớp học chung có chia sẻ thành viên tĩnh không?
- 15. Tìm đối tượng có thành viên dữ liệu với giá trị duy nhất trong Java?
- 16. Có thể lặp qua các thành viên của lớp trong java không?
- 17. bạn bè có lớp học nhưng không thể truy cập thành viên riêng
- 18. Hàm const thành viên có thể trả về một con trỏ không const cho một thành viên dữ liệu không?
- 19. trình khởi tạo thành viên không đặt tên cho thành viên hoặc lớp cơ sở dữ liệu không tĩnh
- 20. khởi In-lớp của các thành viên dữ liệu tĩnh
- 21. C++ 11; Có thể khởi tạo thành viên dữ liệu không tĩnh truy cập các thành viên dữ liệu khác không?
- 22. Đây có phải là dấu hiệu rò rỉ bộ nhớ trong Java không?
- 23. Tại sao tôi không thể có một thành viên const tĩnh không tách rời trong một lớp học?
- 24. Các thành viên thực thể có nên là các kiểu dữ liệu nguyên thủy hoặc các kiểu dữ liệu java không?
- 25. Đường ray có trong cơ sở dữ liệu bộ nhớ
- 26. Lớp C++ không có thành viên tên là
- 27. Có bộ điều hợp bộ nhớ cục bộ 'mở' nào cho Dữ liệu Ember không?
- 28. Tôi có nên sử dụng các thành viên dữ liệu tĩnh không? (C++)
- 29. C++ lỗi: lớp đã không có thành viên mang tên
- 30. Trình biên dịch đảm bảo rằng không có trạng thái thành viên dữ liệu nào được thay đổi trong hàm thành viên const? (hoặc trong C++ hoặc java)
+1 cho liên kết rất tốt – Arne
Một JVM hiện đại giữ dữ liệu giám sát đối tượng trong các bit không được sử dụng của các con trỏ khác mà nó nắm giữ (ví dụ: hai bit cuối của con trỏ lớp) – dty
@Danny: Nó có ba bit; Quản lý bộ nhớ "hiện đại" sắp xếp trên ranh giới 8 byte (khi không làm việc với các mảng, mà là dày đặc hơn). Và bởi "hiện đại", tôi có nghĩa là * mọi thứ * trong 10 năm hoặc hơn. –