一、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-hk/n/360319.html
微信掃一掃
支付寶掃一掃