我有一個在 Linux 平台上運行的 JBoss 應用程序,它的頂部輸出如下(實際上不是準確的數據):
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
總共有1.6g實體內存,還有9.7g DATA部分。實際上,JVM 配置的堆大小約為 128m。我的問題是java應用程式的DATA部分儲存是什麼?有什麼線索嗎?我該如何優化它?
謝謝,埃姆雷
答案1
DATA
意味著應用程式使用分配的記憶體brk(2)
- 即擴展資料段。
Java 有很多不同的東西會放入資料段中:
- 堆疊
- 本機運行時層分配的任何記憶體(使用
native
關鍵字的程式碼) - 使用 JNI/JNA 從 Java 載入的 DLL/共享庫分配的任何內存
- JIT 載入、解釋和編譯位元組程式碼的記憶體(程式碼快取)
- GC 和其他運行時支援程式碼使用的記憶體結構
- 堆疊
請注意,為程式提供 128MB 堆將會分配更多,因為 Java 也會建立一些不屬於堆的結構來管理堆。所以 128MB 意味著您將有 128MB 可以用來分配 Java 物件。
答案2
這是專用於可執行程式碼以外的實體記憶體量,也稱為「資料駐留集」大小或 DRS。一般來說,您可以參考詳細描述所有列的手冊頁。若要取得手冊頁,請鍵入man top
。