背景

最近很多同学咨询pod的rss和jvm内存的差异
image.png

内存说明

rss

VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
这些都是针对于操作系统来说的
对于单java进程的pod来说其实就是说目前java进程分配了内存已经
而rss>90%作为告警项目的目的是避免出现pod因为内存占用过多导致被cgroup杀死

java

毋庸置疑 即相关年轻代 老年代等
https://zhuanlan.zhihu.com/p/101495810
相关参考以上连接

相关解释和联系

关于rss作为应用常驻内存
从我们使用的java内存来说
其通过xmx或者xms申请的内存均是虚拟内存
此时并未直接和操作系统申请到实质内存
当我们的服务使用内存逐步增加 此时会逐步向操作系统申请
但是一旦申请完毕 通常不会进行释放
但是从java来说 由于java从业者关注的是使用java的内存
即有可能发生内存虽然后续老年代被回收了 但是实际上rss不会下降

因此rss可能存在激增【比如该应用产生大对象 但是并未超过xmx 其向服务器申请更多内存 此时rss激增 但是哪怕通过fgc 该大队对象回收 也不会降低rss】

相关资料

操作系统以页为单位管理内存,当进程发现需要访问的数据不在内存时,操作系统可能会将数据以页的方式加载到内存中,这个过程是由上图中的内存管理单元(MMU)完成的。操作系统的虚拟内存作为一个抽象层,起到了以下三个非常关键的作用:

  • 虚拟内存可以利用内存起到缓存的作用,提高进程访问磁盘的速度;
  • 虚拟内存可以为进程提供独立的内存空间,简化程序的链接、加载过程并通过动态库共享内存;
  • 虚拟内存可以控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性;

https://draveness.me/whys-the-design-os-virtual-memory/