瞭解非堆記憶體的引數配置
虛擬機器還有一些記憶體用於方法區,執行緒棧和直接記憶體的使用。
方法區配置:
方法區主要存放類的元資訊。
在JDK1.6和1.7版本中,可以使用-XX:PermSize和-XX:MaxPermSize配置永久區大小。其中-XX:PermSize表示初始的永久區大小,-XX:MaxPermSize表示最大永久區。
在JDK1.8中,永久區被徹底移除,使用了新的元資料區存放類的元資料。預設情況下,元資料區只受系統可用記憶體的限制,但依然可以使用引數-XX:MaxMetaspaceSize指定永久區的最大可用值
棧配置:
棧是每個執行緒私有的記憶體空間。在java虛擬機器中可以使用-Xss引數指定執行緒的棧大小。
直接記憶體配置:
直接記憶體也是java程式中非常重要的組成部分,特別是NIO被廣泛使用後,直接記憶體變得很普遍。直接記憶體跳過了java堆,使java程式可以直接訪問原生堆空間,因此,從一定程度上加快了記憶體空間的訪問速度。但是,使用直接記憶體一定可以提高記憶體訪問速度也是不正確的。
最大可用直接記憶體可以使用引數-XX:MaxDirectMemorySize配置,如果不設定,預設值最大堆空間,即-Xmx。當直接記憶體使用量達到-XX:MaxDirectMemorySize時,就會觸發垃圾回收,如果垃圾回收不能有效釋放足夠空間,也會引起系統OOM。
直接記憶體適合申請次數較少,訪問比較頻繁的場合,如果記憶體空間本身需要頻繁申請,則並不適合使用直接記憶體。
虛擬機器工作模式:
java虛擬機器支援Client和Server兩種執行模式,通過java -version檢視當前執行模式:
虛擬機器在Server模式和Client模式下的各種引數可能會有很大不同,可以使用-XX:+PrintFlagsFinal檢視引數預設值。
以上是兩種模式下引數的不同值。