JVM調優總結 -Xms -Xmx -Xmn -Xss 

jvm 內存 在不同的情況下如何增大 及 PermGen space 相關

JVM日誌和參數的理解

JVM崩潰Log日誌分析

-Xms 為jvm啓動時的內存
-Xmx 為jvm運行最大內存
-Xss  為jvm每個線程內存大小
-Xmn :設置年輕代大小。
整個堆大小=年輕代大小 + 年老代大小 ,而非整個堆大小=年輕代 大小 + 年老代大小 + 持久代大小
-XX:PermSize=64M     JVM初始分配的非堆內存
-XX:MaxPermSize=128M JVM最大允許分配的非堆內存
-XX:MaxDirectMemorySize=10M   最大直接內存

堆和非堆

1,堆就是Java代碼可及的內存,是留給開發人員使用的;
2,非堆就是JVM留給自己用的,
  方法區、JVM內部處理或優化所需的內存(如JIT編譯後的代碼緩存)、每個類結構(如運行時常數池、字段和方法數據)以及方法和構造方法的代碼都在非堆內存中。

直接內存(Direct Memory)

並不是虛擬機運行時數據區的一部分,也不是Java虛擬機規範中定義的內存區域,也可能導致OutOfMemoryError 異常出現

在JDK 1.4 中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝區(Buffer)的I/O 方式,

它可以使用Native 函數庫直接分配堆外內存,然後通過一個存儲在Java 堆裏面的DirectByteBuffer 對象作為這塊內存的引用進行操作。

這樣能在一些場景中顯著提高性能,因為避免了在Java 堆和Native 堆中來回複製數據。

優點:

Java直接內存與非直接內存性能測試

直接內存需要allocateDirect創建,但是它比申請普通的堆內存需要耗費更高的性能。
不過,這部分的數據是在JVM之外的,因此它不會佔用應用的內存。

ByteBuffer有兩種:

heap ByteBuffer -> -XX:Xmx
1.一種是heap ByteBuffer,該類對象分配在JVM的堆內存裏面,直接由Java虛擬機負責垃圾回收,
direct ByteBuffer -> -XX:MaxDirectMemorySize
2.一種是direct ByteBuffer是通過jni在虛擬機外內存中分配的。通過jmap無法查看該快內存的使用情況。只能通過top來看它的內存使用情況