Java應用程序的本地內存(Metaspace)是否從堆內存中獲取空間,或者是否有完全不同的專用內存?Java中的內存管理 - 元空間/本機內存
我認爲它使用的操作系統使用的內存管理所有的應用程序,但不清楚。
Java應用程序的本地內存(Metaspace)是否從堆內存中獲取空間,或者是否有完全不同的專用內存?Java中的內存管理 - 元空間/本機內存
我認爲它使用的操作系統使用的內存管理所有的應用程序,但不清楚。
Java堆空間
Java堆的空間被用於Java運行時分配內存以對象和JRE類。每當我們創建任何對象時,它總是在堆空間中創建。垃圾收集在堆內存上運行以釋放沒有任何引用的對象所使用的內存。在堆空間中創建的任何對象都具有全局訪問權限,並且可以從應用程序的任何位置引用。
Java堆棧存儲器
Java堆棧存儲器用於一個線程的執行。它們包含特定於方法的值,這些值是短暫的,並引用堆中從該方法引用的其他對象。堆棧內存始終以LIFO(後進先出)順序引用。無論何時調用方法,都會在堆棧內存中爲該方法創建一個新塊,以保存本地原始值並引用該方法中的其他對象。一旦方法結束,該塊將變爲未使用狀態,並可用於下一個方法。與堆內存相比,堆棧內存的大小非常小。 Java堆空間和棧存儲器之間
差分
堆存儲器用於由應用而棧存儲器的所有部分被執行的一個線程僅使用。
每當創建對象時,它總是存儲在堆空間中,並且堆棧內存中包含對它的引用。堆棧內存僅包含本地原始變量和引用變量以便堆空間中的對象。
存儲在堆中的對象是全局可訪問的,而堆棧存儲器不能被其他線程訪問。
堆棧中的內存管理以LIFO方式完成,而堆內存中的內存管理更復雜,因爲它在全局範圍內使用。堆內存分爲年輕一代,老一代等,更多詳情請見Java Garbage Collection。
堆棧內存是短暫的,而堆內存從開始直到應用程序執行結束。
我們可以使用-Xms和-Xmx JVM選項來定義堆內存的啓動大小和最大大小。我們可以使用-Xss來定義堆棧內存大小。
當堆棧內存已滿時,Java運行時會拋出java.lang.StackOverFlowError
,而如果堆內存已滿,則會拋出java.lang.OutOfMemoryError: Java Heap Space
錯誤。
與堆內存相比,堆棧內存大小非常小。由於內存分配簡單(LIFO),與堆內存相比,堆棧內存非常快。
參考:
這是Java的內存管理的基本的,但經歷的參考材料應該給你全面的想法。
編輯
由於@rajvineet來指出這個偉大的文章how the JVM uses native memory on Windows and Linux。特別是該部分,how the Java runtime uses native memory清楚地描述了一切。
爲了精確,我的問題是這個堆棧內存/ nativememory(類加載器元素使用的內存)是否使用堆內存的一部分。 – rajvineet
感謝您的回覆。但爲了精簡,我的問題是這個堆棧內存/本機內存(類加載器元素使用的內存)是否使用堆內存的一部分。假設你已經爲你的Java應用程序分配了3 GB的堆內存。所以,無論由java應用程序消耗的本機內存是否將成爲這個3 GB內存的一部分? – rajvineet
得到了一個有用的鏈接,它解釋了在java中所有這些內存管理: - – rajvineet