我有一個在 k8s 上運行的 java 行程。
我設定 Xms 和 Xmx 來處理。
java -Xms512M -Xmx1G -XX:SurvivorRatio=8 -XX:NewRatio=6 -XX: UseConcMarkSweepGC -XX: UseParNewGC -XX: CMSParallelRemarkEnabled -jar automation.jar
我的期望是 pod 應該消耗 1.5 或 2 GB 記憶體,但它消耗更多,接近 3.5 GB。太多了。如果我在虛擬機上運行我的行程,它消耗的記憶體要少得多。
當我檢查 pod 的記憶體統計資訊時,我認為該 pod 分配了過多的快取記憶體。
Rss 近 1.5GB 還可以。因為 Xmx 是 1gb。但是為什么快取將近3GB。
有沒有辦法調整或控制這種用法?
/app $ cat /sys/fs/cgroup/memory/memory.stat
cache 2881228800
rss 1069154304
rss_huge 446693376
mapped_file 1060864
swap 831488
pgpgin 1821674
pgpgout 966068
pgfault 467261
pgmajfault 47
inactive_anon 532504576
active_anon 536588288
inactive_file 426450944
active_file 2454777856
unevictable 0
hierarchical_memory_limit 16657932288
hierarchical_memsw_limit 9223372036854771712
total_cache 2881228800
total_rss 1069154304
total_rss_huge 446693376
total_mapped_file 1060864
total_swap 831488
total_pgpgin 1821674
total_pgpgout 966068
total_pgfault 467261
total_pgmajfault 47
total_inactive_anon 532504576
total_active_anon 536588288
total_inactive_file 426450944
total_active_file 2454777856
total_unevictable 0
uj5u.com熱心網友回復:
Java 行程可能消耗比指定更多的物理記憶體-Xmx
- 我在這個答案中解釋了它。
但是,在您的情況下,它甚至不是 Java 行程的記憶體,而是作業系統級別的頁面快取。通常你不需要關心頁面快取,因為它是共享的可回收記憶體:當應用程式想要分配更多記憶體,但沒有足夠的立即可用的空閑頁面時,作業系統可能會釋放部分頁面快取自動地。從這個意義上說,頁面快取不應該算作“已用”記憶體——它更像是作業系統出于良好目的而使用的備用記憶體,而應用程式不需要它。
當應用程式執行大量檔案 I/O 時,頁面快取通常會增長,這很好。
Async-profiler可能有助于找到確切的增長源:
運行它-e filemap:mm_filemap_add_to_page_cache
我在演示文稿中演示了這種方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/438941.html
標籤:Kubernetes 记忆 内存泄漏 虚拟机 Kubernetes-pod