Tôi không tìm kiếm thông thường "bạn chỉ có thể gợi ý GC trong Java bằng cách sử dụng System.gc()" câu trả lời, đây không phải là tất cả những gì câu hỏi này là về.Java: Làm thế nào để bạn thực sự buộc một GC bằng cách sử dụng ForceGargabeCollection của JVMTI?
Câu hỏi của tôi không chủ quan và dựa trên thực tế: GC có thể buộc phải thực hiện trong Java. Rất nhiều chương trình mà chúng tôi sử dụng hàng ngày làm điều đó: IntelliJ IDEA, NetBeans, VisualVM.
Tất cả đều có thể buộc GC xảy ra.
Làm cách nào?
Tôi coi là tất cả đều đang sử dụng JVMTI và cụ thể hơn là ForceGarbageCollection (chú ý đến "Force") nhưng làm thế nào tôi có thể tự mình thử?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
Cũng lưu ý rằng câu hỏi này không phải là về "tại sao" Tôi muốn làm điều này: "tại sao" có thể là "tò mò" hoặc "chúng tôi đang viết một chương trình tương tự như VisualVM", v.v.
Câu hỏi thực sự là "làm cách nào để ép buộc GC bằng cách sử dụng ForceGarbageCollection của JVMTI"?
JVM có cần được khởi chạy với bất kỳ thông số đặc biệt nào không?
Có bất kỳ JNI nào được yêu cầu không? Nếu vậy, mã nào chính xác?
Tính năng này chỉ hoạt động trên máy ảo Sun?
Bất kỳ ví dụ hoàn chỉnh và dễ hiểu nào sẽ được chào đón nhiều nhất.
tôi sẽ không gọi nó là một giáo điều dựa trên một sự giải thích pedantic. Hầu hết các JVM ngoài kia đều có thể đơn giản vô hiệu hóa các lệnh gọi tới System.gc(), do đó bạn không thể tin tưởng các cuộc gọi đó để làm bất cứ điều gì. Khá thường xuyên, nơi bạn có một ứng dụng tốt bằng văn bản, nơi gc đang làm việc vui vẻ, giới thiệu một thư viện nơi nhà phát triển nghĩ rằng ông có thể "đảm bảo bộ nhớ khả dụng" bằng cách gọi System.gc(), tắt nó là cách tốt nhất để trở lại hiệu suất gc tốt của bạn. – Fredrik
Người dùng vẫn có quyền kiểm soát điều đó. Đối với máy ảo điểm phát sóng, bạn có thể đặt '-XX: + DisableExplicitGC' hoặc bạn không. Vì vậy, miễn là bạn có quyền kiểm soát các cờ JVM 'System.gc()' là khá đáng tin cậy. Các đối số chỉ áp dụng cho các nhà văn thư viện những người không thể kiểm soát những lá cờ/không thể giả định trên đó VM nó sẽ chạy. Đó là một trường hợp chung (spec) so với việc sử dụng cụ thể (với tất cả các tham số được kiểm soát bởi người dùng). – the8472
Các nhà văn ứng dụng thường không có quyền kiểm soát các cờ JVM. Ngoại lệ là khi ứng dụng được gói trong trình khởi chạy ngăn người dùng hoặc sysadmin tinh chỉnh chúng. Đây không phải là người đi bộ. Trong thực tế, lá cờ là có đặc biệt để bảo vệ con người chống lại các ứng dụng Java/các nhà văn ứng dụng làm những điều ngu xuẩn. –