2012-03-12 11 views
6

Trong ứng dụng của tôi, tôi chạy một số luồng với mã không đáng tin cậy và vì vậy tôi phải ngăn chặn tràn bộ nhớ. Tôi có một WatchDog mà phân tích thời gian của thread hiện tại (các chủ đề được gọi là trong nối tiếp). Nhưng làm cách nào tôi có thể xác định mức sử dụng bộ nhớ? Tôi chỉ biết sử dụng bộ nhớ của toàn bộ VM với Runtime.totalMemory()? Nếu có khả năng tìm hiểu cách sử dụng luồng, hoặc việc sử dụng quy trình đơn, nó sẽ là tuyệt vời. Với việc sử dụng bộ nhớ của quá trình tôi có thể tính toán việc sử dụng các sợi anyway.Sử dụng bộ nhớ của luồng hoặc quá trình trong Java

+6

Theo định nghĩa, một chuỗi chia sẻ cùng một không gian bộ nhớ với các chủ đề khác trong quy trình. Câu hỏi của bạn không có ý nghĩa nhiều. JVM = quy trình. 1 quá trình có nhiều chủ đề. –

+0

JVM = quy trình, điều đó có nghĩa là mọi quá trình java đều có một JVM riêng? – Nicolas

+0

Có. Khi bạn bắt đầu java, bạn bắt đầu một JVM mới. –

Trả lời

2

Vì JVM thực hiện chương trình Java là một quá trình Java, bạn không phải lo lắng về điều đó. Tất cả các chủ đề chia sẻ cùng một không gian bộ nhớ trong quá trình JVM.

Vì vậy nó là đủ để dựa vào

0

Những gì bạn cần làm là để chạy mã không tin cậy trong quá trình riêng của mình/JVM. Điều này có thể sử dụng các giao diện JNI (nếu hệ điều hành của bạn cho phép nó).

1

Ứng dụng Java không thể kiểm soát lượng bộ nhớ hoặc (hoặc CPU) được sử dụng bởi các chủ đề của nó, bất kể chuỗi đang chạy mã đáng tin cậy hay không đáng tin cậy. Không có API để thực hiện điều này trong các JVM thế hệ hiện tại. Và chắc chắn không có API để theo dõi việc sử dụng bộ nhớ của một luồng. (Nó thậm chí không rõ ràng rằng đây là một khái niệm có ý nghĩa ...)

Cách duy nhất bạn có thể đảm bảo để kiểm soát việc sử dụng tài nguyên của mã Java không tin cậy là chạy mã trong một JVM riêng biệt và sử dụng mức hệ điều hành kiểm soát tài nguyên (chẳng hạn như ulimit, nice, sigstop, etc) và "-Xmx" để giới hạn việc sử dụng tài nguyên của JVM đó.


Một thời gian trở lại, Mặt trời sản xuất JSR 121 nhằm giải quyết vấn đề này. JSR này sẽ cho phép một ứng dụng được chia thành các phần (được gọi là "cô lập") được truyền thông qua truyền thông điệp và cung cấp khả năng cho một cô lập theo dõi và kiểm soát một phần khác. Thật không may, các API cách ly vẫn chưa được triển khai trong bất kỳ JVM chính thống nào.