2010-08-05 31 views
8

Điều này có thể khá cơ bản, nhưng rất tò mò muốn biết. Dưới đây là đoạn mã và đầu raThu thập GC ở đây là gì?

public class PlainSystemGC { 

    public static void main(String ...strings) { 

     System.out.println("Free Memory (Before GC): " + Runtime.getRuntime().freeMemory()); 

     System.gc(); 

     System.out.println("Free Memory (After GC): " + Runtime.getRuntime().freeMemory()); 
    } 
} 

và đầu ra

Free Memory (Before GC): 1859640 
Free Memory (After GC): 1911768 

Tôi quan tâm để biết những gì đang GC thu thập ở đây vì không có đối tượng được tạo ra.

Bộ nhớ được giải phóng là gì? (Và điều đó quá 52kb)


@JSauer - Nó cung cấp cho chính xác kết quả tương tự ngay cả khi chạy 100 lần

+0

Không phải lúc nào cũng giống nhau: http://ideone.com/5UkgE (122416 giải phóng) – NullUserException

+0

@NullUserExeception - Số lượng bộ nhớ được giải phóng có thể khác nhau trên các JVMS khác nhau, nhưng số được giải phóng sẽ giống nhau trên các lần chạy khác nhau của cùng một mã – JWhiz

Trả lời

9

Trên hầu hết các triển khai JVM phương pháp main không phải là thực sự là mảnh đầu tiên của mã Java được chạy trong khi khởi động JVM.

Thông thường, nhiều phần của một JRE hoàn chỉnh được tự thực hiện trong Java. Ví dụ, một phần lớn của cơ chế trình nạp lớp được thực hiện trong Java thuần túy. Nó thậm chí có thể viết các phần của thuật toán thu gom rác trong Java.

Do đó, có thể đã có một số rác từ các lớp hệ thống mà gc có thể thu thập ngay cả khi ứng dụng của bạn không tạo ra rác nào cả. Bằng cách này, ứng dụng của bạn tạo ra ít nhất một đối tượng đủ điều kiện để thu gom rác tại điểm System.gc() được gọi là: String đề cập đến bộ nhớ miễn phí được tạo động và không được giữ trong một biến, vì vậy nó có thể tốt được gc-ed trong cuộc gọi System.gc().

+0

Rất đúng. Nhưng, Chuỗi sẽ không chắc chắn tiêu thụ 52K bộ nhớ;) tôi tin rằng ... – JWhiz

+0

Ngoài ra, việc sử dụng một trường tĩnh có thể làm cho mã khởi tạo lớp được chạy. Ví dụ, nếu lớp System không được khởi tạo trước main(), sử dụng System.out sẽ làm cho nó trở thành. Xem đặc tả ngôn ngữ tại http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44557. –

+1

Tôi nghi ngờ rằng 'Chuỗi' được sử dụng trong' System.out' sẽ bị thu gom rác. Ngay cả khi nó không được giữ trong một biến, nó được thực thi bởi lớp 'String' vì nó là một chữ. – samitgaur

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