2009-04-15 24 views
11

làm cách nào tôi có thể yêu cầu thu gom rác Java bên ngoài, bắt đầu chương trình từ JAR (Windows BAT được sử dụng)?Cách yêu cầu thu gom rác JVM (không phải từ mã) khi chạy từ dòng lệnh của Windows

  • Từ mã Java tôi có thể làm điều đó với System.gc()
  • Khi chạy một bản phân phối JNLP, tôi có được điều này "Java console" bật từ Control Panel/Java/... và Java console này cung cấp thủ công rác bộ sưu tập.

Nhưng ... Khi tôi đang chạy bình từ dòng lệnh/bat giao diện điều khiển java dường như không mở. Không thể tìm thấy sự giúp đỡ với một googling ngắn gọn, có lẽ ai đó ở đây?

Trả lời

9

Bạn có thể sử dụng jconsole để kết nối với JVM đang chạy cục bộ - Nút này cung cấp nút "Thực hiện GC" trên GUI.

Bạn sẽ cần chỉ định -Dcom.sun.management.jmxremote khi bạn khởi động quá trình java của mình.

+0

Cảm ơn, dường như làm việc tốt! – Touko

5

Nếu bạn sử dụng java 6 mới nhất, bạn cũng có jvisualvm bổ sung và mở rộng chức năng jconsole. Cả hai đều là những công cụ rất hữu ích.

1

Bạn thường không nên có bất kỳ lý do nào để buộc thu gom rác thải. Làm như vậy, messes lên các thuật toán thu gom rác (chủ yếu là hiệu suất của họ). Nó cũng sẽ làm chậm chương trình trong khi rác đang được thu thập. Nếu có vấn đề về bộ nhớ, bạn nên sử dụng các công cụ theo dõi bộ nhớ để tìm ra nơi tài liệu tham khảo đang được giữ lại? (Người nghe chưa đăng ký?)

Như trong các câu trả lời khác, bạn có thể sử dụng jconsole hoặc jvisualvm. Bạn cũng có thể sử dụng jmx để làm điều đó theo chương trình.

+0

Có nhiều cách sử dụng hợp pháp để buộc thu thập GC. Một là cho mục đích thử nghiệm. Một ví dụ khác: nếu bạn đang phát triển trong một hệ thống bộ nhớ thấp với trao đổi SSD. Java không biết nếu bộ nhớ là "bộ nhớ nhanh" hay hoán đổi. Vì vậy, Java có xu hướng sử dụng tất cả bộ nhớ trống trước khi tự động kích hoạt GC. Fire GC thủ công có thể giúp ích rất nhiều trong trường hợp này. Rõ ràng nó không được khuyến khích trong bất kỳ trường hợp sử dụng sản xuất máy chủ (ít nhất tôi không thể hình ảnh một bây giờ). –

3

Đối với phương pháp dòng lệnh thuần túy, bạn sẽ có thể sử dụng jcmd. Tôi tin rằng jcmd là một phần của bản cài đặt JDK chuẩn vì ít nhất là Java 1.7. Lệnh sẽ là một cái gì đó như thế này:

jcmd <process-id> GC.run 

Bạn có thể có được một danh sách các lệnh chẩn đoán có sẵn mà jcmd cung cấp cho một quá trình đặc biệt như thế này:

jcmd <process-id> help