2010-10-18 50 views

Trả lời

10

GC sẽ tự động xóa bất kỳ biến nào không còn trong phạm vi.

Biến được khai báo trong một khối, chẳng hạn như vòng lặp for, sẽ chỉ nằm trong phạm vi trong khối đó. Khi mã đã thoát khỏi khối, GC sẽ xóa nó. Điều này xảy ra ngay khi lặp lại vòng lặp kết thúc, do đó danh sách trở nên đủ điều kiện để thu thập rác ngay khi mỗi lần lặp của vòng kết thúc.

Phạm vi của biến cũng là lý do tại sao i sẽ không hợp lệ sau vòng lặp mẫu của bạn.

Lưu ý rằng đây chỉ là trường hợp nếu bạn sử dụng biến chỉ trong vòng lặp. Nếu bạn chuyển nó sang một phương thức khác mà giữ một tham chiếu đến nó, biến của bạn sẽ không bị thu gom rác.

+0

Tôi nghĩ rằng anh ta lo lắng hơn rằng các đối tượng được gán cho 'myList' trong các vòng lặp trước đó của vòng lặp sẽ được GC'd, ngay cả khi vẫn còn trong vòng lặp. Không phải sau vòng lặp. –

+0

Điểm tốt, tôi đã cập nhật câu trả lời để giải quyết vấn đề đó. –

+1

Tôi không biết câu trả lời này có đủ hay không. Đầu tiên, các số nguyên và các loại giá trị khác được phân bổ trên ngăn xếp và không có gì để làm với bộ sưu tập rác. Thứ hai, myList có thể hoặc có thể không đủ điều kiện để thu gom rác; nó phụ thuộc vào việc liệu một tham chiếu khác có được lưu trữ ở đâu đó trong mã của bạn hay không. –

6

Chúa, không! GC của Java nhiều, nhiều, nhiều hơn thông minh hơn thế.

+0

Vâng, nếu kết quả 'buildList()' ghi đè 'finalize()' nó sẽ là thảm họa. Nhưng hãy hy vọng mã là lành mạnh. –

+0

@Martinho: Làm thế nào? –

+0

Đối tượng ghi đè xong() được xử lý rất đặc biệt bởi bộ thu gom rác. –

0

bạn không phải lo lắng về rác. Java GC sẽ tự động thực hiện việc này. Nhưng đề nghị của tôi là một nhà phát triển giỏi, bạn phải thực hành để giải phóng rác. Như GC sẽ mất một số thời gian proccesing. Vì vậy, bằng cách chăm sóc ourself chúng tôi chắc chắn sẽ tăng hiệu suất.

3

GC reclaims tất cả các trường hợp unreachable, khi nào nó muốn. Nó không phải biến GC.

Biến số imyList trực tiếp trên ngăn xếp. Khi vòng lặp for kết thúc (khi chúng đi ra khỏi phạm vi), chúng sẽ được đẩy vào ngăn xếp và do đó bộ nhớ của chúng được khai hoang. Các biến sẽ biến mất. Đặt biến tham chiếu myList thành null ngay trước khi biến mất, thực sự không tạo ra sự khác biệt nào (đối với các phiên bản GCing). Nếu GC sẽ lấy lại bộ nhớ cho cá thể myList được giới thiệu, thực sự phụ thuộc vào việc bạn có tham chiếu khác đến cùng một cá thể hay không.

Biến không nhận được GC, trường hợp thực hiện.

+0

+1 cho "Biến không được GC, trường hợp làm" – Eugene

3

Có thể sẽ giúp hiểu cú pháp phía sau vòng lặp for. Đó là thảo luận trong JLS Section 14.14.1.

BasicForStatement: 
    for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement 

... 

Statement: 
    StatementWithoutTrailingSubstatement 
    ... 

StatementWithoutTrailingSubstatement: 
    Block 
    EmptyStatement 
    ExpressionStatement 
    ... 


Block: 
    { BlockStatementsopt } 

BlockStatements: 
    BlockStatement 
    BlockStatements BlockStatement 

BlockStatement: 
    LocalVariableDeclarationStatement 
    ClassDeclaration 
    Statement 

Statement, như mọi khi, có thể là một lệnh đơn hay một khối (báo cáo bao quanh với dấu ngoặc nhọn). Một khối đại diện cho một phạm vi từ vựng mới và các biến được khai báo trong đó là cục bộ cho khối đó. Những gì nhiều người không nhận ra là không phải là duy nhất cho vòng lặp. Tôi có thể đặt một câu lệnh chặn ở bất kỳ đâu trong một phương thức:

public void someMethod() { 

    { 
     List<String> myList = new ArrayList<String>(); 
     System.out.println(myList); 
    } 
    System.out.println(myList.size()); //compile error: myList out of scope 
} 

Dù sao điều này cũng không xảy ra.Đủ để nói rằng nó có ít hơn để làm với thực tế là nó là một vòng lặp và nhiều hơn nữa để làm với thực tế rằng nó là một khối (nếu bạn chọn không sử dụng một tuyên bố khối, bạn không thể khai báo các biến địa phương mới để vấn đề là không liên quan).

+0

Điều này có nghĩa là GC không được sử dụng để quản lý bộ nhớ cho các biến/trường hợp được khai báo trong một khối không? Khi khối đã kết thúc, các biến/thể hiện được tự động khôi phục? – shady

+0

Không, nó không có nghĩa là. Các trường hợp vẫn được đặt trên heap và được khai thác bởi gc. Hãy nhớ rằng khối có thể dễ dàng rò rỉ một tham chiếu đến một trong những trường hợp đó. Tất cả những gì tôi muốn nói là phạm vi của một biến được giới hạn trong một khối, bất kể cấu trúc điều khiển được sử dụng. –

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