A. java中的堆外內存具體是怎麼實現的
在Java領域,堆外內存的概念被廣泛應用於Netty和JDK等庫中,通過DirectBuffer實現。DirectBuffer在底層調用系統提供的資源來分配內存,而非依賴Java堆區。具體來說,Unsafe類底層調用系統調用來實現內存分配。這里可能涉及os::malloc或者mmap。
os::malloc和mmap是實現堆外內存分配的兩種方法。os::malloc直接從操作系統內存池中分配內存,而mmap則映射操作系統物理內存到應用程序的虛擬地址空間,提供文件映射或共享內存的高效訪問方式。兩者都是系統調用,用於提供低級別的內存管理。
關於堆外內存的存儲位置,它被分配在用戶態管理的內存區域。選擇用戶態內存而非內核態內存的原因,主要是為了提高數據訪問效率和降低內存管理開銷。內核態內存由操作系統管理,訪問速度通常較慢且需要額外的開銷。
理解系統調用、mmap、內核態和用戶態的概念對於深入掌握堆外內存的實現至關重要。系統調用是操作系統提供的介面,允許應用程序執行底層操作,如內存分配、文件操作等。mmap允許程序以高效的內存映射方式訪問文件或共享內存。內核態和用戶態則是操作系統管理進程的方式,用戶態運行應用程序,內核態則處理系統級任務。掌握這些基礎概念有助於更好地理解Java內存管理和多線程編程。
B. 新建一個JAVA線程,佔用的是JAVA堆內存還是操作系統的內存
Thread對象本身是在堆內存創建的,調用start()後開辟的線程空間是屬於棧內存的。內存管理在Java語言中是JVM自動操作的,當JVM發現某些對象不再需要的時候,就會對該對象佔用的內存進行重分配(釋放)操作,而且使得分配出來的內存能夠提供給所需要的對象。
在一些編程語言裡面,內存管理是一個程序的職責,但是書寫過C++的程序員很清楚,如果該程序需要自己來書寫很有可能引起很嚴重的錯誤或者說不可預料的程序行為,最終大部分開發時間都花在了調試這種程序以及修復相關錯誤上。
相關信息
在以前的編程過程中,手動內存管理帶了計算機程序不可避免的錯誤,而且這種錯誤對計算機程序是毀滅性的,所以內存管理就成為了一個很重要的話題,但是針對大多數純面向對象語言而言,比如Java,提供了語言本身具有的內存特性。
自動化內存管理,這種語言提供了一個程序垃圾回收器(Garbage Collector[GC]),自動內存管理提供了一個抽象的介面以及更加可靠的代碼使得內存能夠在程序裡面進行合理的分配。最常見的情況就是垃圾回收器避免了懸掛引用的問題。
因為一旦這些對象沒有被任何引用「可達」的時候,也就是這些對象在JVM的內存池裡面成為了不可引用對象,該垃圾回收器會直接回收掉這些對象佔用的內存,當然這些對象必須滿足垃圾回收器回收的某些對象規則,而垃圾回收器在回收的時候會自動釋放掉這些內存。