2010-06-12 34 views
6

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

6

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.

+0

+1 cho liên kết rất tốt – Arne

+1

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

+0

@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. –

4

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ó.

+0

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ớ? –

+3

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. –

+1

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. –

3

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ó.

+0

đối tượng không cần lưu trữ con trỏ "này" (vì mã phải có sẵn con trỏ này để truy cập đối tượng ....) – mikera

+0

Vâng, chúng có. Họ cần một con trỏ đến những gì trong C++ sẽ được gọi là bảng phương thức ảo. – dty

2

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

+0

+1 cho một thử nghiệm thực sự !! – mikera

Các vấn đề liên quan