2010-03-15 31 views

Trả lời

10

Trả lời (các) câu hỏi bạn đã đặt ra trong comment:

Một khi bạn đã hiển thị một hộp thoại:

setVisible(true); 

bạn giấu nó bằng cách gọi:

setVisible(false); 

và sau đó bạn phải gọi:

dialog.dispose(); 

để đảm bảo rằng tất cả các nguồn tài nguyên giao diện bản địa hộp thoại được sử dụng được giải phóng. Một khi bạn đã làm điều này, bộ thu gom rác sẽ dọn sạch tất cả các đối tượng khi bạn không còn tham chiếu đến chúng nữa.

+0

và nếu nó không phải là một hộp thoại.Đó là lớp đơn giản, thì cách bạn sẽ đề xuất – Sameer

+0

Nếu nó là một lớp đơn giản, sau đó nó bị "hủy" bởi bộ thu gom rác khi bạn không còn tham chiếu đến nó nữa. –

+0

Tôi nghĩ điều tương tự cũng nên xảy ra với lớp hộp thoại. – Sameer

4

Không cần xóa đối tượng. Bộ thu gom rác sẽ xử lý bộ nhớ ngay sau khi nó không còn được tham chiếu nữa.

+0

nhưng tôi tạo hộp thoại với jpanel bên trong nó và jpanel đó sẽ vẫn được tham chiếu. Tôi muốn hủy hộp thoại đó khi nhấn nút của riêng tôi "Hủy" – joseph

+0

Vì vậy, bạn có thể đặt nó thành null – RubyDubee

+0

@joseph: Xóa 'JPanel' khỏi hộp thoại khi đóng nó, nếu bạn sẽ tiếp tục giữ một tham chiếu đến 'JPanel'. Điều đó sẽ ngăn chặn 'JPanel' giữ một tham chiếu đến hộp thoại và giữ nó (hộp thoại) xung quanh. –

2

Bạn có nghĩa là "cách" để tiêu diệt nó? Không có cách nào để phá hủy một đối tượng một cách rõ ràng trong Java. bộ thu gom rác trong Java sẽ tự động thu hồi bộ nhớ bị chiếm bởi nó Nếu không có tham chiếu về cùng tồn tại.

"nhưng tôi có thể tạo hộp thoại với JPanel bên trong nó, và JPanel đó sẽ là vẫn referrenced. Tôi muốn tiêu diệt rằng hộp thoại khi bấm nút riêng tôi 'Hủy'

Chỉ cần cố gắng đặt đối tượng JPanel đó thành null hoặc gọi phương thức vứt bỏ đối tượng đó nếu có.

2

Nếu bạn muốn xóa chỉ định mà đối tượng tham chiếu đến null, để khi Garbage Collector chạy trong lần tiếp theo, nó có thể phá hủy đối tượng nghĩ rằng nó không được tham chiếu.

3

Bạn có thể ghi đè phương thức finalize() (xem http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize%28%29) để thực hiện dọn dẹp khi đối tượng bị hủy.

Tuy nhiên, không giống như C++, không có sự đảm bảo nào khi phương thức này được gọi. Trong C++ bạn có các đối tượng được lưu trữ ngăn xếp bị hủy khi thực thi rời khỏi phạm vi mà chúng đã được định nghĩa.

Trong Java tất cả đối tượng được lưu trữ trên heap. Họ sẽ được hoàn thành khi người thu gom rác quyết định thu thập chúng (ngụ ý rằng chúng không thể truy cập từ ứng dụng của bạn) nhưng bạn không biết khi nào GC sẽ khởi động. Vì vậy, nếu bạn có một số dọn dẹp phải diễn ra tại một điểm (ví dụ, đóng một tập tin để nó có thể được ghi vào), bạn phải tự viết mã và không dựa vào phương thức finalize() được gọi.

Các mô hình điển hình để thực hiện điều đó là dựa trên một khối try ... finally:

X x = null; 
try { 
    // ... do some stuff 
    x = ... // obtain an object 
    ... // do some stuff 
} 
finally { 
    if(x != null) 
    x.close(); // Perform cleanup WRT x 
} 

(Phải thừa nhận rằng, xấu xí)

2

Không cần để tiêu diệt đối tượng trong Java theo cách như trong C++.Có bộ thu gom rác tự hủy (tự động phát hành bộ nhớ được sử dụng bởi) các đối tượng sau khi không có tham chiếu đến đối tượng này trong mã đang chạy. Tất cả mọi thứ mà bạn có thể làm là để lực lượng phá hủy liên kết bởi Object obj = null; Điều này giết chết tham chiếu đến obj.

5
  1. Nếu nó là một cửa sổ và nếu nó là có thể nhìn thấy

    I. frame.setVisible (false);

    II. frame.dispose();

    II. bộ tài liệu tham khảo để null (ex .. khung = null;)

  2. Nếu nó không phải là một tài liệu tham khảo Window

    I.set null (ex .. x = null;)

Đó là tất cả, một khi đối tượng được tự do GC sẽ giải phóng tài nguyên khi nó giống như.

Đây là những điều bạn phải hiểu

*. Bạn là lập trình viên Java không thể ép buộc bộ sưu tập rác trong Java; nó sẽ chỉ kích hoạt nếu JVM nghĩ rằng nó cần một bộ sưu tập rác dựa trên kích thước heap Java.

*. Có các phương pháp như System.gc()Runtime.gc() được sử dụng để gửi yêu cầu thu gom rác tới JVM nhưng không đảm bảo rằng việc thu gom rác sẽ xảy ra.

*. Nếu không có không gian bộ nhớ để tạo đối tượng mới trong Heap Java Virtual Machine ném OutOfMemoryError hoặc đống java.lang.OutOfMemoryError gian

Và tìm kiếm về vấn đề này ...

J2SE 5 (Java 2 Standard Edition) cho biết thêm một tính năng mới được gọi là Ergonomics. mục tiêu của thái là cung cấp hiệu suất tốt từ JVM với tối thiểu điều chỉnh dòng lệnh.

1

"System.gc()" là cách tốt nhất.

gc-Garbage Collector.

Đây là cách bạn đang gonna phá hủy các đối tượng trong chương trình riêng của mình

Mã mẫu:

public class TestRun 
{ 
    public static void main(String args[]) 
    { 
    /*1*/  TestRun tr=new TestRun(); 
    /*2*/  System.gc(); //You can omit this step. This is just an example. 
    /*3*/  tr=null;  
    /*4*/  System.gc(); 
    }  
} 

Giải thích

  1. mỗi object của class TestRun được tạo ra và tham chiếu của nó là được lưu trữ trong biến 'tr'.

  2. Bộ thu gom rác được gọi. Nhưng không có hiệu lực. Vì không có đối tượng nào bị bỏ qua.

  3. Đối tượng đã được tạo ở bước 1, hiện đã bị hủy đăng ký.Nhưng không gian bị chiếm đóng bởi vật thể vẫn bị nó chặn lại.

  4. Bộ gom rác được gọi lại, và bây giờ nó thấy rằng đối tượng đã được tạo ở bước 1 hiện bị hủy đăng ký. Do đó, bây giờ nó giải phóng không gian chiếm đóng bởi đối tượng và đối tượng bây giờ đã bị xóa khỏi bộ nhớ bằng ngôn ngữ đơn giản.

Thực tế, nó sẽ xóa tất cả các đối tượng đó đã bị hủy đăng ký.

Thực tiễn tốt là tiếp tục gọi nó trong mã của bạn.

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