2011-08-02 24 views
12

Khi tôi có một lớp học như thế này:Các phương thức trong các cá thể lớp có chiếm một vị trí trong bộ nhớ không?

class Test { 
    private int _id = 0 ; // 4 bytes 
    private int _age = 0 ; // 4 bytes 
} 

Tôi chắc chắn rằng mỗi thể hiện của nó sẽ tiêu thụ hơn 8 byte trong bộ nhớ vì 2 số nguyên.

Nhưng còn phương pháp thì sao? Nếu tôi có một lớp học với một triệu phương pháp, và 2 trường hợp của nó, là các phương pháp sẽ mất nhiều gấp đôi vị trí trong bộ nhớ?

Tính năng này hoạt động như thế nào?

Cảm ơn bạn.

Trả lời

19

Không. Phương thức chỉ xảy ra một lần trong bộ nhớ . Họ không thay đổi trên cơ sở từng trường hợp, do đó, họ không cần bộ nhớ trên cơ sở từng trường hợp.

Một đối tượng trong Java về cơ bản bao gồm một số "vệ sinh" kích thước cố định (một con trỏ đến thông tin loại bao gồm vtable), các bit liên quan đến GC (suy nghĩ và quét), thông tin về màn hình cho ví dụ vv - và sau đó là các trường.


Đây là một chút đơn giản. Có thể có các biểu diễn khác nhau, chẳng hạn như bytecode, mã gốc vv - nhưng đó là bất kể trường hợp riêng biệt.

+0

Jon Skeet - Người duy nhất có thể nhận được hai upvotes trong 45 giây. –

7

Có hai phiên bản của cùng một lớp không trùng lặp dung lượng cần thiết cho mã phương thức. Đó là để nói, các phương thức cư trú ở một nơi trong bộ nhớ và sau đó mỗi thể hiện của lớp có một con trỏ trỏ đến vị trí đó trong bộ nhớ. Điều này là bởi vì nếu không bộ nhớ sẽ bị lãng phí. Mã cần được thực hiện cho mỗi phương thức là như nhau, bất kể trường hợp nào của lớp gọi nó, vì vậy nó sẽ không có ý nghĩa để sao chép nó.

3

Nhưng để thực hiện các phương thức như instance.method(), bản sao cục bộ của phương thức sẽ được thực hiện trong ngăn xếp trên mỗi trường hợp, trong trường hợp thể hiện sẽ nằm trong vùng heap.

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