2013-02-19 72 views
1

我發現這個堆棧溢出問題從2010: Lock or Pin java process into memory如何將Java進程鎖定到內存? (MLOCK)

基本上它說來鎖定一個java程序到存儲器中的方法是通過使用JNI。它指向的例子是一個斷開的鏈接。現在,這是2013年我的問題是..有沒有更好的方法?有沒有人在某個地方使用Java中的mlock?我對JNI和一般的C代碼都不熟悉,但對Java很熟悉(儘管我從來沒有使用過JNI)。

感謝

+0

我的記憶鎖定過程的唯一經歷是從1978年開始,當時一位同事違背了每個人的建議,並把系統關閉了。我*強烈*建議你不要這樣做。 – EJP 2013-02-19 22:54:54

+0

我想出於安全考慮。沒有涉及「系統」。只是一次性的過程。 – Craig 2013-02-19 23:01:43

+0

您確定要將整個進程固定在內存,整個JVM中,還是隻需要確保包含某個緩衝區(例如密碼或其他敏感數據)未被換出?不幸的是,我不知道答案,但如果你能擺脫後者,我會選擇前者。整個JVM進程可以擁有相關的大量內存。 – 2013-02-19 23:15:16

回答

0

我想知道如果有一個很好的Java解決方案如果可能的話,不涉及的JNI。

沒有。固定內存中的應用程序是特定於操作系統的,並且不受標準JVM API支持。


由於可能會對整體系統性能產生嚴重影響,所以要安排一個相當危險的事情......。因此,它需要在任何支持它的系統上的root權限(或等效)。

我個人不會嘗試這樣做,並會非常猶豫地使用這樣做的應用程序。什麼都那就是你正在努力實現將(可能)最好是在一些其他的方式做...


我想這樣做,出於安全原因。

哦。所以你究竟試圖做的是停止「超級祕密」的東西被寫入光盤上的交換/頁面空間?

  1. 我不相信mlock會防止被寫入交換的東西。

  2. 如果有人可以訪問交換盤,那麼他們可以使用其他機制來提取數據;例如通過使用「/ dev/mem」或等價物從物理內存或進程虛擬內存中讀取內容。

  3. 解決交換盤上「超級祕密」問題的正常方法是使用字符數組而不是字符串來保存東西,並在完成後用零手動覆蓋它們。

  4. 或調查光盤級加密。

0

我一直在尋找類似的東西,發現這個:

https://github.com/LucidWorks/mlockall-agent/

這似乎是一個非常好的解決方案,以牽制Java內存的問題。如果您使用它,請確保您的初始堆大小(-XMs)設置爲與最大堆大小相同(-Xmx) - 文檔說如果您不這樣做,則在初始堆之後分配的任何內存將不會被鎖定。