
1. 術語
1.1. 堆指代Java堆
1.2. 原生記憶體指代JVM的非堆記憶體
1.2.1. 包括C堆
1.2.2. 非堆記憶體就是原生記憶體
1.2.3. 一些常見的JDK類常常會使用原生記憶體,請確保正確使用這些類
1.3. 一個應用程式總的記憶體占用
1.3.1. JVM使用的原生記憶體和堆記憶體的總和
1.3.2. 確保所有Java行程總的記憶體占用不超過機器的物理記憶體
1.3.3. 對JVM性能至關重要的是其整體記憶體占用,特別是和作業系統相關部分的記憶體占用
2. 測量記憶體占用工具
2.1. Unix
2.1.1. top
2.1.2. ps
2.2. Windows
2.2.1. perfmon
2.2.2. VMMap
3. 提交的記憶體
3.1. committed memory
3.2. 大小會隨著堆的大小變化而變化
3.3. 提交的記憶體會隨著堆的增加而相應增加
4. 駐留集大小
4.1. resident set size,RSS
4.2. 在Unix系統中
5. 應用程式的作業集
5.1. working set
5.2. 在Windows系統中
6. 最小化記憶體占用
6.1. 減小堆的最大值(或者設定GC優化引數,讓堆永遠不會完全占滿)可以限制程式的記憶體占用
6.2. 執行緒堆疊是相當大的,特別是對于64位的JVM來說
6.3. 代碼快取使用原生記憶體來保存編譯后的代碼
6.3.1. 如果空間受限導致所有代碼都不能被編譯,那么性能會受影響
6.4. 原生庫可以分配自己的記憶體
7. 原生記憶體跟蹤
7.1. Native Memory Tracking,NMT
7.2. NMT是HotSpot的一部分
7.2.1. HotSpot是運行程式的Java位元組碼的C++引擎
7.3. 兩種關鍵資訊
7.3.1. 總提交大小
7.3.1.1. JVM的總提交大小(理想情況下)接近于行程占用的物理記憶體量
7.3.2. 單個提交大小
7.4. -XX:NativeMemoryTracking=off|summary|detail
7.4.1. 查看原生記憶體的資訊
7.4.2. 默認值是off
7.4.3. 概要模式(summary)或詳情模式(detail)
7.4.3.1. % jcmd process_id VM.native_memory summary
7.5. -XX:+PrintNMTStatistics標志
7.5.1. JVM會在程式退出時輸出原生記憶體的分配資訊
7.5.2. 默認是false
7.6. -XX:-AutoShutdownNMT標志
7.6.1. NMT自動關閉
7.6.2. 默認是true
7.7. Oracle Studio Profiler
7.7.1. 一個混合語言分析器
7.7.2. 既能分析原生代碼也能分析Java代碼的性能分析器
7.7.3. 只能跟蹤原生代碼的記憶體分配,不能跟蹤Java代碼的
8. 原生NIO緩沖區
8.1. -XX:MaxDirectMemorySize=N
8.1.1. 為直接位元組緩沖區分配的記憶體總量
8.1.2. 默認值是0
8.1.3. 在Java 8的后期版本(以及Java 11的所有版本)中,這個限制的最大值等于堆的最大值
9. 頁面(page)
9.1. 作業系統分配的最小單元
9.2. 作業系統用來管理物理記憶體的記憶體單位
9.3. 作業系統分配的頁面比物理記憶體能容納的頁面多很多
9.4. 最常用的映射保存在轉換后備緩沖區(translation lookaside buffer,TLB)中
9.5. 長期運行的JVM幾乎總能受益于大頁的使用,特別是當它有大堆時
9.5.1. 使用大頁通常會顯著加快應用程式的速度
9.5.2. 在大多數作業系統上,必須顯式開啟大頁支持
9.6. -XX:+UseLargePages標志
9.6.1. 開啟大頁的使用
9.6.2. 默認情況是false
9.6.3. 不支持大頁的系統JVM不會發出警告,它會使用常規的頁面
9.7. Linux把大頁稱為巨頁(huge page)
9.7.1. 傳統巨頁是在內核啟動時預留的,它一直可用
9.7.2. 傳統巨頁是鎖定在記憶體中的,它們永遠并不能被交換
9.8. Linux透明巨頁
9.8.1. 透明巨頁可以被交換到磁盤上,這對性能是不利的
9.8.2. 透明巨頁是按需分配的
9.8.3. 透明巨頁的配置在作業系統層面和Java層面都是不同的
9.8.4. 3個選項
9.8.4.1. always
9.8.4.1.1. 在可能的情況下,所有的程式都會獲得巨頁
9.8.4.2. madvise
9.8.4.2.1. 請求巨頁的程式會獲得巨頁,其他程式會獲得常規的4 KB的頁面
9.8.4.3. never
9.8.4.3.1. 沒有程式可以獲得巨頁,即使是請求了巨頁的程式
9.8.5. UseTransparentHugePages標志
9.8.5.1. 系統無法提供巨頁,這種情況下不會發出警告
9.8.6. 由于透明巨頁在交換和分配方面的差異,通常不建議在Java中使用它
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/546058.html
標籤:其他
