一、Nonheap介紹
Java虛擬機將內存劃分為兩個區域:heap和nonheap。
Heap區用於存儲Java對象和JVM需要管理的數據。
Nonheap區用於存儲JVM本身和Java類相關的信息。
除了Static數據和代碼區,其他的Java代碼都在Heap中運行。
而非Java數據的JVM或者Java類定義等信息是存儲在Nonheap中的。
二、Nonheap的組成
Java中的Nonheap主要由Java虛擬機自己管理。
主要包含以下幾個主要的元素:
1. Code Cache
Code Cache存放被JIT編譯後的本地代碼(native code)。
2. PermGen Space
PermGen Space存儲Java類信息(例如類名稱、訪問修飾符等),以及方法和欄位的元數據信息。
3. Metaspace
Java SE 8中,PermGen space被Metaspace替換,因為PermGen space在過多使用時會導致內存問題。所以,Metaspace用來存放類元信息。
4. Stack
Stack中存儲著線程的運行狀態,包括方法調用堆棧、局部變數信息和操作數棧。
5. Direct Buffers
Direct Buffers是non-heap的一部分。
6. JNI
Java Native Interface,是Java中調用非Java的C或其他本地庫的介面。
三、代碼示例
class NonHeapDemo{ public static void main(String[] args) { //查找NonHeap區Header容量 long nonheapHeaderSize = sun.misc.VM.maxDirectMemory() - sun.misc.VM.currentDirectMemory(); System.out.println("NonHeap Header Size: " + nonheapHeaderSize); //獲取Code Cache大小 long codeCacheSize = ((com.sun.management.HotSpotDiagnosticMXBean) ManagementFactory.getDiagnosticMXBean()).getLargestCompilationLevel(); System.out.println("Code Cache Size: " + codeCacheSize); //獲取PermGen Space或者Metaspace的大小 long metaspaceSize = ((com.sun.management.GarbageCollectorMXBean) ManagementFactory.getGarbageCollectorMXBeans().get(0)).getMemoryPoolNames().stream() .filter(pool -> pool.contains("Metaspace")) .map(ManagementFactory::getMemoryPoolMXBean) .mapToLong(MemoryPoolMXBean::getUsage).mapToLong(Usage::getMax).sum(); System.out.println("PermGen Space/Metaspace Size: " + metaspaceSize); //獲取Direct Buffers大小 long directBufferSize = ((com.sun.management.BufferPoolMXBean) ManagementFactory.getPlatformMXBeans(BufferPoolMXBean.class).get(0)).getTotalCapacity(); System.out.println("Direct Buffer Size: " + directBufferSize); //獲取JNI信息 System.out.println("JNI: " + sun.misc.SharedSecrets.getJavaLangAccess().getJNIMethods().size()); } }
四、Nonheap的重要性
Nonheap對Java應用的運行也有很大的影響。
例如,Nonheap中的Direct Buffers如果不管控得當,會導致應用內存泄漏,最終導致JVM崩潰。
而且,PermGen Space也需要注意大小,因為如果PermGen Space不足,可能會導致「內部錯誤:Java堆空間溢出」,這是因為PermGen的比例比例比例如今應用的內存。
因此,掌握Nonheap的基本知識和調優方法是十分重要的。
原創文章,作者:KMUHY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/360319.html