2012-03-12 61 views
6

在我的應用程序中,我運行了一些不受信任代碼的線程,因此我必須防止內存溢出。我有一個WatchDog分析當前線程的時間(線程被串行調用)。 但我如何確定內存使用情況? 我只知道整個VM的內存使用情況,Runtime.totalMemory()? 如果有可能找出線程的使用情況,或使用單個進程,那就太好了。通過該過程的內存使用情況,我可以計算線程的使用情況。Java中線程或進程的內存使用情況

+6

根據定義,線程與進程中的其他線程共享相同的內存空間。你的問題沒有多大意義。 JVM =進程。 1進程有很多線程。 – 2012-03-12 20:29:39

+0

JVM = process,這意味着每個java進程都有一個自己的JVM? – Nicolas 2012-03-12 20:32:00

+0

是的。當你啓動java時,你啓動一個新的JVM。 – 2012-03-12 20:32:54

回答

2

由於執行Java程序的JVM是Java進程,因此您不必擔心這一點。所有線程在JVM進程中共享相同的內存空間。

因此,它是充分依靠

0

你需要做的是在自己的進程/ JVM運行不受信任的代碼。這可以使用JNI接口(如果您的操作系統允許)。

1

Java應用程序無法控制其線程使用的內存量(或CPU)數量,而不管線程是運行受信任代碼還是不受信任代碼。在當代JVM中沒有用於執行 的API。而且肯定沒有用於監視線程內存使用情況的API。 (甚至不清楚這是否是一個有意義的概念......)

要保證控制不可信Java代碼的資源使用情況,唯一的方法是在單獨的JVM中運行代碼,並使用操作系統級別資源控制(如ulimit,nice,sigstop等)和「-Xmx」來限制JVM的資源使用。


有段時間,Sun製作了JSR 121旨在解決這個問題。這個JSR將允許應用程序分成通過消息傳遞進行通信的部分(稱爲「隔離區」),並提供了一個隔離區監視和控制另一個的能力。遺憾的是,隔離API尚未在任何主流JVM中實現。

相關問題